加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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;
}

好吧,我发现导致问题的有问题的代码,但我不确定它为什么导致它.
当我从main while循环中删除loadValue(studentID [i])时,代码按预期工作.但当我把它放回去时,它再次破裂.

解决方法

_delay_ms(500)行引起了Oli Charlesworth所述的问题.如果设置为高(250ms以上),_delay_ms()函数可能会导致不可预测的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读