logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[c]dziwne zachowanie zmiennej uint8_t

piotrva 17 Sty 2011 18:23 2297 3
REKLAMA
  • #1 9018922
    piotrva
    VIP Zasłużony dla elektroda
    Witam mam taki kod do obsługi wyświetlacza LED i jest problem w funkcji led_dec:
    
    #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?
  • REKLAMA
  • #2 9018985
    Krauser
    Poziom 26  
    Zakres uint8_t to 0...255.
  • REKLAMA
  • Pomocny post
    #3 9019002
    Konto nie istnieje
    Poziom 1  
REKLAMA