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

[ATMega32][SN75176] - problemy z obsługą UARTu porzez przer.

Citek 03 Mar 2009 20:10 3973 2
  • #1 6231981
    Citek
    Poziom 22  
    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

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

    [ATMega32][SN75176] - problemy z obsługą UARTu porzez przer.
  • Pomocny post
    #2 6232262
    Nol
    Poziom 15  
    Albo mi się wydaje, albo w tym pierwszym kodzie UARTa nie inicjalizujesz (np. w drugim masz od tego funkcje UART_Init(2400) w funkcji main. Przede wszystkim wywal z pierwszego listingu kod, który nie ma nic wspólnego z uartem i wypadałoby również pokazać co siedzi w funkcjach do obsługi UARTa.
  • #3 6232298
    Citek
    Poziom 22  
    Wiesz co ci powiem... działa. :)
    Taki głupi błąd...
    A ja już godzinę czasu szukałem błędu...
    Wielkie Dzięki :)))))
REKLAMA