Witam mam taki kod do obsługi wyświetlacza LED i jest problem w funkcji led_dec:
Czy ktoś wie czym jest spowodowany problem opisany w komentarzu? Czy ja coś źle rozumiem z tymi typami, czy to zachowanie jest normalne?
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "led_lib.h"
#define SEG_A (1<<1)
#define SEG_B (1<<2)
#define SEG_C (1<<3)
#define SEG_D (1<<4)
#define SEG_E (1<<5)
#define SEG_F (1<<6)
#define SEG_G (1<<7)
#define SEG_DP (1<<0)
volatile uint8_t cyfry[4];
uint8_t wzory[15] PROGMEM = {
~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),
~(SEG_B|SEG_C),
~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),
~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),
~(SEG_B|SEG_C|SEG_F|SEG_G),
~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),
~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),
~(SEG_A|SEG_B|SEG_C|SEG_F),
~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),
~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),
};
void led_init(void){
LED_DATA_DIR = 0xFF;
//cały port danych jako wyjście
LED_DATA = 0xFF;
//wygaszamy wyświetlacze
LED_COM_DIR |= COM1 | COM2 | COM3 | COM4;
//sterowanie jako wyjścia
LED_COM |= (COM1 | COM2 | COM3 | COM4);
//wyłączenie sterowania
//konfiguracja timera0
TCCR0A = (1<<WGM01); //tryb ctc
TCCR0B = (1<<CS00)|(1<<CS02); //preskaler 1024
OCR0A = 78; //przerwanie z f=200Hz
TIMSK0 = (1<<OCIE0A); //zezwolenie na przerwanie compare match A
}
void led_dec(uint16_t liczba){
int8_t i;//teraz działa poprawnie, ale jak zmienię na uint8_t to wtedy na wyświetlaczu mam zawsze 0000, pomimo, że powinno działać tak samo dla uint8_t jak i int8_t, bo oba typy mają w zakresie swoich wartości 0
for(i=3;i>=0;--i){
cyfry[i]=liczba%10;
liczba /=10;
}
/*cyfry[3]=liczba%10;
liczba /=10;
cyfry[2]=liczba%10;
liczba /=10;
cyfry[1]=liczba%10;
liczba /=10;
cyfry[0]=liczba%10;*/
}
ISR(TIMER0_COMPA_vect){
static uint8_t licznik = 1;
LED_COM |= (COM1 | COM2 | COM3 | COM4);
//wyłączenie wszystkich wyświetlaczy
if(licznik==1){
LED_COM &= ~COM1;
LED_DATA = pgm_read_byte(&wzory[cyfry[0]]);
}else if(licznik==2){
LED_COM &= ~COM2;
LED_DATA = pgm_read_byte(&wzory[cyfry[1]]);
}else if(licznik==3){
LED_COM &= ~COM3;
LED_DATA = pgm_read_byte(&wzory[cyfry[2]]);
}else if(licznik==4){
LED_COM &= ~COM4;
LED_DATA = pgm_read_byte(&wzory[cyfry[3]]);
licznik=0;
}
licznik++;
}
Czy ktoś wie czym jest spowodowany problem opisany w komentarzu? Czy ja coś źle rozumiem z tymi typami, czy to zachowanie jest normalne?