c – AVR – 中断向量和全局变量
发布时间:2020-12-16 06:56:39 所属栏目:百科 来源:网络整理
导读:我使用ATmega32来中断每32ms做一些任意的事情,这对现在来说并不重要. 我正在使用timer0的定时器溢出来中断,这可以预测和完美地工作. 我的问题是我有一个全局变量: volatile int isSampling; 这不是在中断向量中写入的.我读到整数需要是volatile来消除编译器
我使用ATmega32来中断每32ms做一些任意的事情,这对现在来说并不重要.
我正在使用timer0的定时器溢出来中断,这可以预测和完美地工作. 我的问题是我有一个全局变量: volatile int isSampling; 这不是在中断向量中写入的.我读到整数需要是volatile来消除编译器优化的可能性,但我声明它是volatile并且它仍然无法正常工作. #include <AVR/IO.h> #include <util/delay.h> #include <avr/interrupt.h> char studentID[12] = {'S',1,2,3,4,5,6,7,'A','B','C','D'}; char buffer[72]; //Max bitlength = 6. * studentID length char repcount[72]; int pointer; volatile int isSampling; void setup(void); void startup(void); void loadValue(unsigned char loadedValue); void processValue(unsigned char processedValue,short bitLength); void sendDot(void); void sendDash(void); int main(){ setup(); while(1) { if (isSampling == 1){ startup(); int i; for (i = 0; i < 12; i++){ loadValue(studentID[i]); //Flash lights after letter sent. _delay_ms(500); PORTB = 0xF0; _delay_ms(500); } } } } void setup(void){ DDRB = 0xFF; sei(); TCCR0 = TCCR0 | 0x05; TIMSK|=(1<<TOIE0); TCNT0 = 0; pointer = 0; isSampling = 1; } ISR(TIMER0_OVF_vect) { //Every 32ms this interrupt vector is called. isSampling = 0; } void startup(void){ //Play LED startup pattern int i; for (i = 0; i < 4; i++){ PORTB = 0b11110011; //Bit 5 is constantly sampled. 4 is output _delay_ms(250); PORTB = PORTB & 0x00; _delay_ms(250); } _delay_ms(500); _delay_ms(500); } void loadValue(unsigned char loadedValue){ switch (loadedValue){ case 1: processValue(0b01111000,5); case 2: processValue(0b00111000,5); case 3: processValue(0b00011000,5); case 4: processValue(0b00001000,5); case 5: processValue(0b00000000,5); case 6: processValue(0b10000000,5); case 7: processValue(0b11000000,5); case 8: processValue(0b11100000,5); case 9: processValue(0b11110000,5); case 0: processValue(0b22222000,5); case 'A': processValue(0b01000000,2); case 'B': processValue(0b10000000,4); case 'C': processValue(0b10100000,4); case 'D': processValue(0b10000000,3); case 'E': processValue(0b00000000,1); case 'F': processValue(0b00100000,4); case 'G': processValue(0b11000000,3); case 'H': processValue(0b00000000,4); case 'I': processValue(0b00000000,2); case 'J': processValue(0b01110000,4); case 'K': processValue(0b10100000,3); case 'L': processValue(0b01000000,4); case 'M': processValue(0b11000000,2); case 'N': processValue(0b10000000,2); case 'O': processValue(0b11100000,3); case 'P': processValue(0b01100000,4); case 'Q': processValue(0b11010000,4); case 'R': processValue(0b01000000,3); case 'S': processValue(0b00000000,3); case 'T': processValue(0b10000000,1); case 'U': processValue(0b00100000,3); case 'V': processValue(0b00010000,4); case 'W': processValue(0b01100000,3); case 'X': processValue(0b10010000,4); case 'Y': processValue(0b10110000,4); case 'Z': processValue(0b11000000,4); case '.': processValue(0b01010100,6); case ',': processValue(0b11001100,6); case '?': processValue(0b00110000,6); case '!': processValue(0b00110000,5); case ':': processValue(0b11100000,6); case '=': processValue(0b10001000,5); } } void processValue(unsigned char processedValue,short bitLength){ unsigned char result; int i; //Enter Loop at the length of bits in numerical morse code for (i = 0; i < bitLength; i++){ result = processedValue & 0x80; processedValue = processedValue << 1; if (result) sendDash(); if (!result) sendDot(); _delay_ms(1000); } } void sendDot(void){ //Send Dot PORTB = 0x05; _delay_ms(250); PORTB = 0x00; } void sendDash(void){ //Send Dash PORTB = 0x06; _delay_ms(750); PORTB = 0x00; } 好吧,我发现导致问题的有问题的代码,但我不确定它为什么导致它. 解决方法
_delay_ms(500)行引起了Oli Charlesworth所述的问题.如果设置为高(250ms以上),_delay_ms()函数可能会导致不可预测的行为.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |