Początek zabawy, i bliski jestem stwierdzenia, że to nie dla mnie.
A więc, albo ktoś podpowie, albo pogryzę tego procka.
Problem jest następujący: Po przerwaniu, program zapala leda i wychodzi z pętli WHILE (zaczyna main()) czyli mój LED zgaszony.
Lub bez przerwania, prog. wchodzi do petli WHILE opuszcza ją i zaczyna od main(). czyli na terminalu widzę powtazajacy się napis *tytul
Szczegóły w kodzie. Może Ktoś przetestuje ?
A więc, albo ktoś podpowie, albo pogryzę tego procka.
Problem jest następujący: Po przerwaniu, program zapala leda i wychodzi z pętli WHILE (zaczyna main()) czyli mój LED zgaszony.
Lub bez przerwania, prog. wchodzi do petli WHILE opuszcza ją i zaczyna od main(). czyli na terminalu widzę powtazajacy się napis *tytul
Szczegóły w kodzie. Może Ktoś przetestuje ?
#include <io.h>
#include "UART.h"
#include <signal.h>
#include <delay.h>
#include <interrupt.h>
#include <util/atomic.h>
unsigned char volatile odebr_zn='0';
unsigned char volatile data;
unsigned char znak;
const int *tytul="Uzycie terminala do zmniany stanu LEDa";
const int *odbior="Odebrano znak ==>";
char i;
/**********Wyslij znak na RS232*********************************************/
void USART_TXR_znak( unsigned char znak )
{
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = znak;
}
/**********Wyslij text na RS232********************************************/
void USART_TXR_text( unsigned char *text )
{
char ile_zn;
ile_zn=(strlen(text)-1);
for (i=0;i<=ile_zn;i++)
{
while ( !( UCSRA & (1<<UDRE)) )
;
UDR = *(text+i);
}
i=0;
przen_linie();
}
/********* Opóźniene ***************************************************/
static void delay(uint16_t us)
{
while ( us ) us--; //1ms-> us=8000
}
/*******Inicjalizacja OUT/IN PIN*******************************************/
void PIN_init(void)
{
/* aktywne stanem niskim, */
DDR(LED_PORT)|=_BV(LED_ZIEL)|_BV(LED_CZER);
PORT(LED_PORT)|=_BV(LED_ZIEL)|_BV(LED_CZER);
/* aktywne stanem niskim, */
DDR(MENU_PORT)|=_BV(TXD)|_BV(MENU)|_BV(MENU_PLUS)|_BV(MENU_MINUS)|_BV(MENU_ENTER)|_BV(OUT_CO); // 0xDE;
PORT(MENU_PORT)=0xDA;
}
/*******Inicjalizacja******************************************************/
void UART_init(unsigned int ubrr)
{
/* 9600 bit/s */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr; // 51 -> 8000000
/* ISR(koniec odbioru),ISR(zakonczenie nadawania RxD=>ON, RxT=>ON */
UCSRB = _BV(TXCIE)|_BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
/* 8-bit dane, 2-bit stopu, brak bitu parzystosci */
UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
}
/********Przerwanie od buffora Odbiorczego RS232****************************/
ISR(USART_RXC_vect ) //SIG_UART_RECV
{
odebr_zn='1';
data=UDR;
}
/*********Przeniesienie do następnej lini***********************************/
void przen_linie(void)
{
USART_TXR_znak(0x0A);
USART_TXR_znak(0x0D);
}
/********MAIN()*************************************************************/
int main(void)
{
PIN_init();
UART_init(MY_UBRR);
USART_TXR_text(tytul);
SREG|=_BV(I);
while(1)
{
if (odebr_zn=='1')
{
//ATOMIC_BLOCK (ATOMIC_FORCEON)
//{
USART_TXR_text(odbior);
USART_TXR_znak(data);
przen_linie();
switch(data)
{
case '1': // wyłacz LEDa
PORT(LED_PORT)|=_BV(LED_ZIEL);
break;
case '2': // włacz LEDa
PORT(LED_PORT)&=~(_BV(LED_ZIEL));
break;
case '3': //
PORT(LED_PORT)|=_BV(LED_CZER);
break;
case '4':
PORT(LED_PORT)&=~(_BV(LED_CZER));
break;
default:
;
} //end switch
odebr_zn=0;
data=0x00;
//} //end ATOMIC
} //end if odebr_zn
} //end while(1)
} //end main
#include <avr/io.h>
#define F_CPU 8000000uL // czestotliwosc oscylatora
#define BAUD 9600 // szybkosc transmisji
#define MY_UBRR F_CPU/16/BAUD-1 // wartosc-preskaler sterujący szybkoscia transmisji
#define LED_PORT PORTB
#define LED_ZIEL 6 // nr pinu LEDA
#define LED_CZER 7 // nr pinu LEDA
#define PWM 1 // Sterowanie serwa
#define Wolne_B0 0 // (ICP1)
#define WOLNE_B2 2 // (OC1B)
#define MENU_PORT PORTD
#define RXD 0 // ON
#define TXD 1 // ON
#define MENU 3
#define MENU_PLUS 4
#define MENU_MINUS 6
#define MENU_ENTER 7
#define OUT_CO 2 // wlacznik czujnika CO
#define T1 5 // pomiar czestotliwosci
#define ADC_PORT PORTC
#define IN_ADC 3 // czujnik fazy
#define OUT_BUZ 2 // BUZZER
#define WIRE 1 // magistrala 1WIRE
#define ADC 0 // LM35 pomiar temperatury
#define WOLNE_C4 4 // (SDA)
#define WOLNE_C5 5 // (SCL)
#define RESET 6 // RESET
#define I 7 // Nr flagi globalnych przerwan
#define PIN(x) (*(&x - 2)) /* address of data direction register of port x */
#define DDR(x) (*(&x - 1)) /* address of input register of port x */
#define PORT(x) (*(&x ))