atmega 32 prosta centralka alarmowa
: pt, 5 czerwca 2015, 19:53
Witam
Prosiłbym o pomoc?
Jestem początkujący programistą ,prosiłbym o wyrozumiałość.Buduję prostą centralkę alarmową na popularnym uC Atmeg32. Ma ona działać na zasadzie takiej że kiedy na ADC pojawi się stan wysoki to w tedy mikro kontroler ma zapalić diodę LED (do pinów PA0-PA7 przypisanych jest 8 diod LED i włączyć buzzer kiedy na ADC pojawi się stan niski mikro kontroler ma zapalić diodę LED (do pinów PB0-PB7 przypisanych jest 8 diod LED ).Po naciśnięciu przycisku TEST Atmega ma zapalić diodę LED i włączyć buzzer.
Kod pisany w C++
#include <avr/io.h>
#define LED1 PD0 //definicja LED1 (do którego pinu podłączony LED1
#define LED2 PD1 //definicja LED2 (do którego pinu podłączony LED2)
#define LED3 PD2 //definicja LED3 (do którego pinu podłączony LED3)
#define LED4 PD3 //definicja LED4 (do którego pinu podłączony LED4)
#define LED5 PD4 //definicja LED5 (do którego pinu podłączony LRD5)
#define LED6 PD5 //definicja LED6 (do którego pinu podłączony LED6)
#define LED7 PD6 //definicja LED7 (do którego pinu podłączony LED7)
#define LED8 PD7 //definicja LED8 (do którego pinu podłączony LED8)
#define LED9 PB0 //definicja LED8 (do którego pinu podłączony LED8)
#define LED10 PB1 //definicja LED1 (do którego pinu podłączony LED1
#define LED11 PB2 //definicja LED2 (do którego pinu podłączony LED2)
#define LED12 PB3 //definicja LED3 (do którego pinu podłączony LED3)
#define LED13 PB4 //definicja LED4 (do którego pinu podłączony LED4)
#define LED14 PB5 //definicja LED5 (do którego pinu podłączony LRD5)
#define LED15 PB6 //definicja LED6 (do którego pinu podłączony LED6)
#define LED16 PB7 //definicja LED7 (do którego pinu podłączony LED7)
#define KLAWISZ1_TEST_PC2 //definicja KLAWISZ 1(do którego pinu podłączony klawisz 1
#define ADCIN PA0 //definicja ADCIN (wejście ADC)
#define ADCIN PA1 //definicja ADCIN (wejście ADC)
#define ADCIN PA2 //definicja ADCIN (wejście ADC)
#define ADCIN PA3 //definicja ADCIN (wejście ADC)
#define ADCIN PA4 //definicja ADCIN (wejście ADC)
#define ADCIN PA5 //definicja ADCIN (wejście ADC)
#define ADCIN PA6 //definicja ADCIN (wejście ADC)
#define ADCIN PA7 //definicja ADCIN (wejście ADC)
int main(void)
{
//Uruchomienie ADC, wewnętrzne napiecie odniesienia, tryb pojedynczej konwersji, preskaler 128, wejście PIN5, wynik do prawej
ADCSRA = (1<<ADEN) //ADEN: ADC Enable (uruchomienie przetwornika)
//ADPS2:0: ustawienie preskalera, preskaler= 128
|(1<<ADPS0)
|(1<<ADPS1)
|(1<<ADPS2);
ADMUX = (1<<REFS1) | (1<<REFS0) //REFS1:0: Reference Selection Bits
//Internal 2.56V Voltage Reference with external capacitor at AREF pin
|(1<<MUX2) | (1<<MUX0); //Input Channel Selections
//ustawienie wejśc/wyjść
DDRD |= (1<<LED1) | (1<<LED2)|(1<<LED3) | (1<<LED4)|(1<<LED5) | (1<<LED6)|(1<<LED7)|(1<<LED8); //Ustawienie pinów sterujących diodami jako wyjścia
DDRC=0xff; //Nieużywane Piny na porcie C jako wyjścia
DDRC &=~ (1<<KLAWISZ); //Ustawienie pinu klawisza jako wejście
DDRC |=(1<<LED17)|(1<<BUZZER);
DDRA &=~ (1<<ADCIN); //Ustawienie Wejścia ADC
DDRB |= (1<<LED9) | (1<<LED10)|(1<<LED11) | (1<<LED12)|(1<<LED13) | (1<<LED14)|(1<<LED15)|(1<<LED16)
PORTC |= (1<<KLAWISZ); //Pull_up klawisz '
for(;;)//pętla główna
{
if(!(PINA & (1<<ADCIN PA0)))//jeśli pojawi się sygnał
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED9);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED1);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED1);
PORTC |= (1<<BUZZER);
}
if(!(PINA & (1<<ADCIN PA1)))//jeśli pojawi sie sygnał
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 zapala diode i gasi buzzer
{
PORTB |= (1<<LED10);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED2);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED2);
PORTC |= (1<<BUZZER);
}
{
if(!(PINA & (1<<ADCIN PA2)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED11);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED3);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED3);
PORTC |= (1<<BUZZER);
}
if (TCNT1 >= 15625)
{
if(!(PINA & (1<<ADCIN PA3)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED12);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED4);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED4);
PORTC |= (1<<BUZZER);
}
if(!(PINA & (1<<ADCIN PA4)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED13);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED5);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED5);
PORTC |= (1<<BUZZER);
}
{
if(!(PINA & (1<<ADCIN PA5)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
}
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED14);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED6);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED6);
PORTC |= (1<<BUZZER);
}
if(!(PINA & (1<<ADCIN PA6)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED15);
PORTD &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED7);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED7);
PORTC |= (1<<BUZZER);
}
if(!(PINA & (1<<ADCIN PA7)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi diode 1 buzer
{
PORTB |= (1<<LED16);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED8);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świec1 obydwie diody
{
PORTD |= (1<<LED8);
PORTC |= (1<<BUZZER);
}
if (PINC &(1<<KLAWISZ1_TEST_PC2)) ;
{
PORTC |= (1<<LED1);
PORTC |= (1<<BUZZER);
}
if (PINC &(1<<KLAWISZ1_TEST_PC2)) ;
{
PORTC |= (1<<LED2);
PORTC |= (1<<BUZZER);
}
}
}
}
Prosił bym o sprawdzenie czy w kodzie nie ma błędów a jeśli są to zaznaczenie ich żebym po prostu wiedział co jest nie tak?
Byłem z tym tematem na Elektrodzie ale tam nikt nie umie mi wytłumaczyć w sposób zrozumiały ewentualnych błędów będących w kodzie .
Dlatego proszę kolegów o pomoc .
Pozdrawiam
Prosiłbym o pomoc?
Jestem początkujący programistą ,prosiłbym o wyrozumiałość.Buduję prostą centralkę alarmową na popularnym uC Atmeg32. Ma ona działać na zasadzie takiej że kiedy na ADC pojawi się stan wysoki to w tedy mikro kontroler ma zapalić diodę LED (do pinów PA0-PA7 przypisanych jest 8 diod LED i włączyć buzzer kiedy na ADC pojawi się stan niski mikro kontroler ma zapalić diodę LED (do pinów PB0-PB7 przypisanych jest 8 diod LED ).Po naciśnięciu przycisku TEST Atmega ma zapalić diodę LED i włączyć buzzer.
Kod pisany w C++
#include <avr/io.h>
#define LED1 PD0 //definicja LED1 (do którego pinu podłączony LED1
#define LED2 PD1 //definicja LED2 (do którego pinu podłączony LED2)
#define LED3 PD2 //definicja LED3 (do którego pinu podłączony LED3)
#define LED4 PD3 //definicja LED4 (do którego pinu podłączony LED4)
#define LED5 PD4 //definicja LED5 (do którego pinu podłączony LRD5)
#define LED6 PD5 //definicja LED6 (do którego pinu podłączony LED6)
#define LED7 PD6 //definicja LED7 (do którego pinu podłączony LED7)
#define LED8 PD7 //definicja LED8 (do którego pinu podłączony LED8)
#define LED9 PB0 //definicja LED8 (do którego pinu podłączony LED8)
#define LED10 PB1 //definicja LED1 (do którego pinu podłączony LED1
#define LED11 PB2 //definicja LED2 (do którego pinu podłączony LED2)
#define LED12 PB3 //definicja LED3 (do którego pinu podłączony LED3)
#define LED13 PB4 //definicja LED4 (do którego pinu podłączony LED4)
#define LED14 PB5 //definicja LED5 (do którego pinu podłączony LRD5)
#define LED15 PB6 //definicja LED6 (do którego pinu podłączony LED6)
#define LED16 PB7 //definicja LED7 (do którego pinu podłączony LED7)
#define KLAWISZ1_TEST_PC2 //definicja KLAWISZ 1(do którego pinu podłączony klawisz 1
#define ADCIN PA0 //definicja ADCIN (wejście ADC)
#define ADCIN PA1 //definicja ADCIN (wejście ADC)
#define ADCIN PA2 //definicja ADCIN (wejście ADC)
#define ADCIN PA3 //definicja ADCIN (wejście ADC)
#define ADCIN PA4 //definicja ADCIN (wejście ADC)
#define ADCIN PA5 //definicja ADCIN (wejście ADC)
#define ADCIN PA6 //definicja ADCIN (wejście ADC)
#define ADCIN PA7 //definicja ADCIN (wejście ADC)
int main(void)
{
//Uruchomienie ADC, wewnętrzne napiecie odniesienia, tryb pojedynczej konwersji, preskaler 128, wejście PIN5, wynik do prawej
ADCSRA = (1<<ADEN) //ADEN: ADC Enable (uruchomienie przetwornika)
//ADPS2:0: ustawienie preskalera, preskaler= 128
|(1<<ADPS0)
|(1<<ADPS1)
|(1<<ADPS2);
ADMUX = (1<<REFS1) | (1<<REFS0) //REFS1:0: Reference Selection Bits
//Internal 2.56V Voltage Reference with external capacitor at AREF pin
|(1<<MUX2) | (1<<MUX0); //Input Channel Selections
//ustawienie wejśc/wyjść
DDRD |= (1<<LED1) | (1<<LED2)|(1<<LED3) | (1<<LED4)|(1<<LED5) | (1<<LED6)|(1<<LED7)|(1<<LED8); //Ustawienie pinów sterujących diodami jako wyjścia
DDRC=0xff; //Nieużywane Piny na porcie C jako wyjścia
DDRC &=~ (1<<KLAWISZ); //Ustawienie pinu klawisza jako wejście
DDRC |=(1<<LED17)|(1<<BUZZER);
DDRA &=~ (1<<ADCIN); //Ustawienie Wejścia ADC
DDRB |= (1<<LED9) | (1<<LED10)|(1<<LED11) | (1<<LED12)|(1<<LED13) | (1<<LED14)|(1<<LED15)|(1<<LED16)
PORTC |= (1<<KLAWISZ); //Pull_up klawisz '
for(;;)//pętla główna
{
if(!(PINA & (1<<ADCIN PA0)))//jeśli pojawi się sygnał
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED9);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED1);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED1);
PORTC |= (1<<BUZZER);
}
if(!(PINA & (1<<ADCIN PA1)))//jeśli pojawi sie sygnał
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 zapala diode i gasi buzzer
{
PORTB |= (1<<LED10);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED2);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED2);
PORTC |= (1<<BUZZER);
}
{
if(!(PINA & (1<<ADCIN PA2)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED11);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED3);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED3);
PORTC |= (1<<BUZZER);
}
if (TCNT1 >= 15625)
{
if(!(PINA & (1<<ADCIN PA3)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED12);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED4);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED4);
PORTC |= (1<<BUZZER);
}
if(!(PINA & (1<<ADCIN PA4)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED13);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED5);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED5);
PORTC |= (1<<BUZZER);
}
{
if(!(PINA & (1<<ADCIN PA5)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
}
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED14);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED6);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED6);
PORTC |= (1<<BUZZER);
}
if(!(PINA & (1<<ADCIN PA6)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi obydwie diody
{
PORTB |= (1<<LED15);
PORTD &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED7);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świecą obydwie diody
{
PORTD |= (1<<LED7);
PORTC |= (1<<BUZZER);
}
if(!(PINA & (1<<ADCIN PA7)))//jeśli klawisz wciśniety
{
ADCSRA |= (1<<ADSC); //ADSC: uruchomienie pojedynczej konwersji
while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
if(ADC<10)//jeśli wynik ADC mniejszy od 10 gasi diode 1 buzer
{
PORTB |= (1<<LED16);
PORTC &=~ (1<<BUZZER);
}
else if(ADC<700)//jeśli 700>ADC>=10 LED1 świeci
{
PORTD |= (1<<LED8);
PORTC &=~ (1<<BUZZER);
}
else //jeśli ADC>=700 świec1 obydwie diody
{
PORTD |= (1<<LED8);
PORTC |= (1<<BUZZER);
}
if (PINC &(1<<KLAWISZ1_TEST_PC2)) ;
{
PORTC |= (1<<LED1);
PORTC |= (1<<BUZZER);
}
if (PINC &(1<<KLAWISZ1_TEST_PC2)) ;
{
PORTC |= (1<<LED2);
PORTC |= (1<<BUZZER);
}
}
}
}
Prosił bym o sprawdzenie czy w kodzie nie ma błędów a jeśli są to zaznaczenie ich żebym po prostu wiedział co jest nie tak?
Byłem z tym tematem na Elektrodzie ale tam nikt nie umie mi wytłumaczyć w sposób zrozumiały ewentualnych błędów będących w kodzie .
Dlatego proszę kolegów o pomoc .

Pozdrawiam