Witam
Mam problem z obsługą przerwań w moim programiku. Niby wszystko jest ok a jednak coś nie działa. Nie wiem czy coś, źle deklaruje czy jak, już nie mam żadnego pomysłu.
Umieszczam kod (trochę rozbudowany :/) i drugi kod na którym wszystko mi działa. Dołączam także schemat
Drugi programik, na którym przerwania działają:
![[ATMega32][SN75176] - problemy z obsługą UARTu porzez przer. [ATMega32][SN75176] - problemy z obsługą UARTu porzez przer.](https://obrazki.elektroda.pl/58_1236107114_thumb.png)
Mam problem z obsługą przerwań w moim programiku. Niby wszystko jest ok a jednak coś nie działa. Nie wiem czy coś, źle deklaruje czy jak, już nie mam żadnego pomysłu.
Umieszczam kod (trochę rozbudowany :/) i drugi kod na którym wszystko mi działa. Dołączam także schemat
#include <avr/io.h> //dostęp do rejestrów
#include <inttypes.h>
#include <util/delay.h> //opóźnienie
#include <avr/interrupt.h> //obsługa przerwań
#include <hd44780.c> //obsługa wyświetlacza
#include <stdlib.h> //itoa
#include <uart.h> //uart
#include "definicje.h"
#include "startup.h"
#include "ds18b20.h"
//#include "klawiatura.h"
#include "menu.h"
//zmienne
int poz = 0;
int menu = 0;
int strzalka = 1;
int strzalkatemp;
int tymczasowa = 0;
int podswietlenie = 1;
int zarowka = 0;
int lampka = 1;
int buzzer = 1;
int pom;
int kogut= 0;
int alarm = 0;
int RS485 = 0;
int licz;
uint8_t raddr, data, chk;
int odbior=100;
SIGNAL(SIG_UART_RECV)
{
raddr = UART_odbierz();
data = UART_odbierz();
chk = UART_odbierz();
odbior=110;
if(chk == (raddr+data))
{
LCD_GoTo(10,1);
LCD_WriteText("OK");
}
else
{
LCD_GoTo(10,1);
LCD_WriteText("Error");
}
}
void piny(void)
{
sbi(DDRA,WYSW);
sbi(PORTA,WYSW);
sbi(DDRB, BUZZER);
sbi(PORTB, BUZZER);
sbi(DDRB, LAMPKA);
sbi(PORTB, LAMPKA);
DDRC = 0b01110000; // ustawiamy prawie cały port C jako wyjścia
PORTC = 0b01111111; // ustalamy wartości początkowe pinów/podciągamy port
}
int main (void)
{
sbi(DDRD,4); //włączenie odbioru
cbi(PORTD,4);
piny();
LCD_Initalize();
LCD_Clear();
startup();
_delay_ms(4000);
temp(34,0);
menustart();
sei();
while(1)
{
if (bit_is_clear(PINC, DOWN) && (menu!=0) && (menu!=3))
{
_delay_ms(200);
strzalka++;
if (strzalka==5)
{
strzalka=1;
}
switch (strzalka)
{
case 1:
strzalka1();
break;
case 2:
strzalka2();
//LCD_WriteText("Wcisnieto przycisk 7");
break;
case 3:
strzalka3();
break;
case 4:
strzalka4();
break;
}
}
if (bit_is_clear(PINC, UP) && (menu!=0) && (menu!=3))
{
_delay_ms(200);
strzalka--;
if (strzalka==0)
{
strzalka=4;
}
switch (strzalka)
{
case 1:
strzalka1();
break;
case 2:
strzalka2();
//LCD_WriteText("Wcisnieto przycisk 7");
break;
case 3:
strzalka3();
break;
case 4:
strzalka4();
break;
}
}
if (bit_is_clear(PINC, ESC) && (menu!=0))
{
_delay_ms(200);
menu--;
if (menu==1)
{
poz = 100;
}
if (menu==2)
{
poz = poz - strzalkatemp;
}
if (menu==3)
{
poz = poz + strzalkatemp;
}
if (menu==0)
{
poz = 0;
}
if(menu==0)
{
menu=0;
}
/*if (strzalka==0)
{
strzalka=4;
}*/
//LCD_WriteData(menu);
switch (poz)
{
case 0:
menustart();
temp(34,0);
break;
case 100:
menu100();
break;
case 110:
menu110();
break;
case 120:
menu120();
break;
case 130:
menu130(poz);
break;
case 131:
menu131();
break;
case 132:
menu132();
break;
}
//itoa
char buff1 [33];
char buff2 [33];
char buff3 [33];
char buff4 [33];
itoa (menu,buff1,10);
itoa (poz,buff2,10);
itoa (strzalka,buff3,10);
itoa (strzalkatemp,buff4,10);
LCD_GoTo(21,1);
LCD_WriteText(buff1);
LCD_GoTo(26,1);
LCD_WriteText(buff2);
LCD_GoTo(31,1);
LCD_WriteText(buff3);
LCD_GoTo(36,1);
LCD_WriteText(buff3);
}
if (bit_is_clear(PINC, OK) && (menu!=3))
{
_delay_ms(200);
menu++;
gdziestrzalka(strzalka);
strzalkatemp = strzalka;
if (menu==1)
{
poz = 100;
}
if (menu==2)
{
poz = poz + 10 * strzalka;
}
if (menu==3)
{
poz = poz + strzalka;
}
if (menu>3)
{
menu = 3;
}
switch (poz)
{
case 100:
menu100();
break;
case 110:
menu110();
break;
case 120:
menu120();
break;
case 122:
menu122(podswietlenie);
break;
case 130:
menu130(poz);
break;
case 131:
menu131();
break;
case 132:
menu132();
break;
}
//itoa
char buff1 [33];
char buff2 [33];
char buff3 [33];
char buff4 [33];
itoa (menu,buff1,10);
itoa (poz,buff2,10);
itoa (strzalka,buff3,10);
itoa (strzalkatemp,buff4,10);
LCD_GoTo(21,1);
LCD_WriteText(buff1);
LCD_GoTo(26,1);
LCD_WriteText(buff2);
LCD_GoTo(31,1);
LCD_WriteText(buff3);
LCD_GoTo(36,1);
LCD_WriteText(buff3);
strzalka = 1;
}
if (licz>1200)
{
if (menu==0)
{
temp(34,0);
licz=0;
}
}
else
{
LCD_GoTo(10,1);
LCD_WriteData(odbior);
licz++;
_delay_ms(10);
char buff5[33];
itoa (licz,buff5,10);
LCD_GoTo(0,0);
LCD_WriteText(buff5);
}
if (bit_is_clear(PINC, DOWN) && (poz==122))
{
_delay_ms(100);
LCD_WriteText("Dziala");
switch (podswietlenie)
{
case 0:
LCD_GoTo(29,0);
LCD_WriteText("OFF");
cbi(PORTA,WYSW);
podswietlenie=1;
break;
case 1:
LCD_GoTo(29,0);
LCD_WriteText("ON ");
sbi(PORTA,WYSW);
podswietlenie=0;
break;
}
}
}
}
void menu122(int pod)
{
LCD_Clear();
LCD_GoTo(1,0);
LCD_WriteText("Podswietlenie");
//LCD_GoTo(1,1);
//LCD_WriteText("");
LCD_GoTo(29,0);
if (pod==0)
{
LCD_WriteText("OFF");
}
else
{
LCD_WriteText("ON ");
}
}
Drugi programik, na którym przerwania działają:
#include <avr/io.h> // dostęp do rejestrów
#include <inttypes.h>
#include <util/delay.h>
#include <hd44780.c>
#include <uart.h>
#include <avr/interrupt.h>
#define cbi(sfr, b) (sfr &= ~(1<<b)) // bit 0 na pin portu
#define sbi(sfr, b) (sfr |= (1<<b)) // bit 1 na pin portu
uint8_t addr, data, chk;
int odbior = 100;
#define adr 0x01
SIGNAL(SIG_UART_RECV)
{
addr = UART_odbierz();
data = UART_odbierz();
chk = UART_odbierz();
if(chk == (addr+data))
{
LCD_WriteText("OK");
}
else
{
LCD_WriteText("Error");
}
odbior=110;
}
int main(void) // program główny
{
UART_Init(2400); // inicjalizacja portu szeregowego
sbi(DDRD,4); //włączenie odbioru
cbi(PORTD,4);
sbi(DDRA,7);
sbi(PORTA,7);
LCD_Initalize();
LCD_Clear();
LCD_WriteText("Ok!");
sei();
while(1) // pętla nieskończona
{
LCD_WriteData(odbior);
}
}
