Also nochmal zu dem Programm.
Diesmal mit vollständigen Quellcodes:
usart_emp.h
usart_bibilothek.hCode:#include <usart_bibliothek.h> int hilf=0; int id=1; /*void set_id(int x) // veraltet { id=x; } */ void set_id (void) { DDRC=0x00; //Port C = Input id =PINC-240; // Einlesen der PINs an Port C. Wert korrektur verbesserungswürdig id=~id-65520; } int empfange (void) { char buffer [10]; unsigned erg=0; unsigned char data = 0; data = USART_receive (); if (data == '?'){ data = USART_receive (); if (data == 'V'){ data = USART_receive (); hilf=data; hilf=hilf-48; if (hilf==id ){ data = USART_receive (); hilf=data; hilf=hilf-48; if (hilf<8) { erg=ad_port(hilf); utoa(erg, buffer, 10); // Wandelt in String USART_transmit('\t'); USART_transmit_string (buffer); USART_transmit('\r'); USART_transmit('\n'); //return 0; } } } else{ if(data == 'A'){ data = USART_receive (); hilf=data; hilf=hilf-48; //char buffer [10]; unsigned erg=0; if(hilf==id){ USART_transmit('\t'); for (int i=0;i<=7;i++) { int erg=ad_port(i); utoa(erg, buffer, 10); // Wandelt in String USART_transmit_string (buffer); USART_transmit('\t'); } USART_transmit('\r'); USART_transmit('\n'); } } } } else{ if(data == '!'){ //USART_transmit_string (" 1.schleife "); data = USART_receive (); if(data == 'I'){ //USART_transmit_string (" 2.schleife "); data = USART_receive (); hilf=data; hilf=hilf-48; if(hilf == id){ //USART_transmit_string (" 3.schleife "); //USART_transmit_string (" Reset "); DDRB = 0xff; PORTB = 0xff-0x01; delay_ms(3000); } } else{ if(data == 'T'){ int t=0; int h=0; int z=0; int e=0; int zwischen_erg=0; data = USART_receive (); hilf=data; hilf=hilf-48; if(hilf == id){ data = USART_receive (); hilf=data; t=hilf-48; zwischen_erg=zwischen_erg+t*1000; data = USART_receive (); hilf=data; h=hilf-48; zwischen_erg=zwischen_erg+h*100; data = USART_receive (); hilf=data; z=hilf-48; zwischen_erg=zwischen_erg+z*10; data = USART_receive (); hilf=data; e=hilf-48; zwischen_erg=zwischen_erg+e*1; // debug code /*utoa(zwischen_erg, buffer, 10); // Wandelt in String USART_transmit_string (buffer); USART_transmit('\t'); */ return zwischen_erg; } } else {} } } else {} } return 9; }
main_prgCode:/*********************************************************** Funktionsbibliothek für den USART des Atmega8 ***********************************************************/ #include <avr/io.h> #define F_CPU 4000000 #define USART_BAUD_RATE 9600 #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1) void USART_Init(void) { UCSRB = _BV(RXCIE) | _BV(TXCIE) | _BV(RXEN) | _BV(TXEN); // wenn einer der zustände 1 dann schreiben UBRRL = (unsigned char) USART_BAUD_SELECT; } void USART_transmit (unsigned char c) { while (!(UCSRA & (1<<UDRE))) {} //wenn speicherfrei und keine Fehler UDR = c; } void USART_trans (unsigned int a) { while (!(UCSRA & (1<<UDRE))) {} UDR = a; } unsigned char USART_receive (void) { while(!(UCSRA & (1<<RXC))) {} return UDR; } void USART_transmit_string (unsigned char *string) { while (!(UCSRA & (1<<UDRE))) {} while ( *string) USART_transmit (*string++); }
io_modul.hCode:#include <avr/io.h> #include <stdlib.h> #include <avr/signal.h> #include <avr/interrupt.h> #include <simple_delayroutinen.c> #include <io_modul.h> volatile unsigned int grenzwert; int hilfs; SIGNAL (SIG_UART_RECV) { int x=0; char buffer [10]; unsigned erg=0; hilfs=empfange(); if(hilfs>10){ grenzwert=hilfs; //debug code /*USART_transmit('\t'); USART_transmit_string (" Im interrupt "); utoa(grenzwert, buffer, 10); USART_transmit_string (buffer); USART_transmit('\t');*/ } } int main (void) { grenzwert=800; //Intialisierung USART_Init (); ad_init(); set_id(); v_ref(5); USART_transmit_string ("!!! Spannungsüberwachung !!!"); USART_transmit('\n'); USART_transmit('\r'); DDRB = 0xff; // Variablen int x=0; char buffer [10]; unsigned erg=0; sei (); // Interrupt erlauben delay_ms(8000); //Einschaltzeitverzögerung for(;;){ PORTB = 0xff; for (int i=0;i<=3;i++) // Überwachen der Ports 0 bis i { erg=ad_port(i); // Port auslesen if(erg < grenzwert) { /*utoa(grenzwert, buffer, 10); USART_transmit('\t'); USART_transmit_string (" In Hauptprg "); USART_transmit_string (buffer); */ PORTB = 0xff-0x02; delay_ms(1000); // Wenn Wert zu niedrig Pin2 von Port B einschalten //debug text /*utoa(i, buffer, 10); USART_transmit_string (" Fehler bei "); USART_transmit_string (buffer); utoa(grenzwert, buffer, 10); USART_transmit('\t'); USART_transmit_string (buffer); USART_transmit('\t'); USART_transmit('\n'); USART_transmit('\r'); */ } } } return 0; }
ad_read.hCode:#include <avr/io.h> #include <stdlib.h> #include <avr/signal.h> #include <avr/interrupt.h> //#include <usart_bibliothek.h> #include <ad_read.h> #include <usart_emp.h> int daten (void) { USART_Init (); // Variablen int x=0; char buffer [10]; unsigned erg=0; ad_init(); v_ref(5); x=empfange(); if (x<8) { erg=ad_port(x); utoa(erg, buffer, 10); // Wandelt in String USART_transmit('\t'); USART_transmit_string (buffer); USART_transmit('\r'); USART_transmit('\n'); return 0; } else { return x; } }
id_portc.hCode:#include <avr/io.h> #include <stdlib.h> #include <avr/signal.h> #include <avr/interrupt.h> //#include <usart_bibliothek.h> unsigned int vref=3; void v_ref(int x) { vref=x; } void ad_init(void) { ADCSRA = _BV(ADEN) | _BV(ADPS2); //Prescaler } unsigned ad_port (int x) { unsigned int high_bit=0; unsigned int unten_bit=0; unsigned erg=0; switch(x) // Portwahl { case 0: break; case 1: ADMUX |= _BV(MUX0); break; case 2: ADMUX |= _BV(MUX1); break; case 3: ADMUX = _BV(MUX0) | _BV(MUX1); break; case 4: ADMUX = _BV(MUX2); break; case 5: ADMUX = _BV(MUX2) | _BV(MUX0); break; case 6: ADMUX = _BV(MUX2) | _BV(MUX1); break; case 7: ADMUX = _BV(MUX2) | (_BV(MUX1)|_BV(MUX0)); break; } ADCSRA |= _BV(ADSC); // Konvertierung Starten while (ADCSRA & _BV(ADSC)) {} //warte, bis ADSC gelöscht wird --> Ende der Konvertierung unten_bit = ADCL; high_bit = ADCH; //erg=(high_bit); erg=((unten_bit+high_bit*256L)*vref)*1000L/1024L; return erg; }
Code:#include <avr/io.h> #include <stdlib.h> #include <avr/signal.h> #include <avr/interrupt.h> //#include <usart_bibliothek.h> #include <ad_read.h> #include <usart_emp.h> int get_id (void) { // Variablen int id; //char buffer [10]; //unsigned erg=0; DDRC=0x00; //Port C = Input id =PINC-240; // Einlesen der PINs an Port C. Wert korrektur verbesserungswürdig id=~id-65520; }







Zitieren

Lesezeichen