Witam.
Połączyłem dwie Atmegi 8 po rs485. Jedna atmega wysyła ramkę 11-bitową (bity wysyłane co 100ms) . ramka to 1 bit startu, liczba (0-9) oraz 2 bity stopu. Druga odbiera te bity i wyświetla liczbę zapisaną w ramce na wyświetlaczu 7 segmentowym. Odbiór danych inicjowany jest poprzez przerwanie od INT0, w obsłudze którego czytam te 11 bitów i obrabiam tak, żeby otrzymać tylko przesyłaną liczbę. Wyświetlacz podpięty do portu B. Piny RE i DE układu MAX485 zwarte i podłączone do PD0. RO - PD2, DI - PD1. Do portu C podłączyłem diodę, migającą w takt przesyłania bitu 1. Ramki przesyłane są co 3 sekundy. Przesyłane są kolejno cyfry od 0 do 9.
Oto kod:
Problem tkwi w przypisaniu
Wyświetlana liczba cały czas jest zerem (ma wartość podaną przy inicjalizacji). Gdy wyświetlę liczbę po tej linijce (w przerwaniu), to wyświetla się poprawnie, lecz po chwili zmienia się na z powrotem na 0. Jeśli zrobię przypisanie np. to problem ten nie występuje - wszystko jest OK.
Męczę się już z tym kilka godzin. Zmieniałem sposoby optymalizacji. Przerwania generowane są dobrze.
Połączyłem dwie Atmegi 8 po rs485. Jedna atmega wysyła ramkę 11-bitową (bity wysyłane co 100ms) . ramka to 1 bit startu, liczba (0-9) oraz 2 bity stopu. Druga odbiera te bity i wyświetla liczbę zapisaną w ramce na wyświetlaczu 7 segmentowym. Odbiór danych inicjowany jest poprzez przerwanie od INT0, w obsłudze którego czytam te 11 bitów i obrabiam tak, żeby otrzymać tylko przesyłaną liczbę. Wyświetlacz podpięty do portu B. Piny RE i DE układu MAX485 zwarte i podłączone do PD0. RO - PD2, DI - PD1. Do portu C podłączyłem diodę, migającą w takt przesyłania bitu 1. Ramki przesyłane są co 3 sekundy. Przesyłane są kolejno cyfry od 0 do 9.
Oto kod:
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
uint8_t cyfry[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};
volatile uint16_t frame=0x0000;
volatile uint8_t liczba=0x00;
int main() {
DDRD=0x03;
PORTD=0x04;
DDRB=0xff;
PORTB=0xff;
DDRC=0x03;
_delay_ms(900);
GICR|=0x40;
MCUCR|=(1<<ISC00)|(1<<ISC01);
sei();
while(1) {
if(liczba<10)
PORTB=cyfry[liczba];
}
}
ISR(INT0_vect) {
uint8_t i=0,liczba2=0;
frame=0x0000;
for(i=0;i<11; ++i) {
if(PIND&0x04) {
PORTC|=0x01;
frame=(frame<<1)|1;
}
else {
PORTC&=~0x01;
frame<<=1;
}
if(i<10) _delay_ms(100);
}
frame>>=2;
for(i=0;i<8; ++i) {
if(frame & (1<<(7-i)))
liczba2|=(1<<i);
}
liczba=liczba2;
}
Problem tkwi w przypisaniu
liczba=liczba2Wyświetlana liczba cały czas jest zerem (ma wartość podaną przy inicjalizacji). Gdy wyświetlę liczbę po tej linijce (w przerwaniu), to wyświetla się poprawnie, lecz po chwili zmienia się na z powrotem na 0. Jeśli zrobię przypisanie np.
liczba=1Męczę się już z tym kilka godzin. Zmieniałem sposoby optymalizacji. Przerwania generowane są dobrze.