Hallo Georg-Johann
DankeIch dachte der Term wird als ganzes gesehen.
Es funktioniert nun eigentlich schon fast. Jedoch hab ich noch ein Problem. Das Auslesen oder das Abspeichern der 16Bit Werte funktioniert noch nicht ganz Richtig. Nach einem Reset ist das Flag für das Abspeichern auf 1 gesetzt. Es soll ein Abspeichern erfolgen wenn der ADC Wert unter 614 ist. Jedoch funktioniert das nicht![]()
Code:/*================================================================= Programmtitel: Unterspannungsaanzeige Autor: Robert Schilling Datum: 2.3.2006 Hardware: LCD an PORTB Led an PortD0 Poti an PC0, PC1 Schalter an PD7 Programmbeschreibung: Die beiden Potis simulieren 2 Lipo Zellen. Sobald der Spannungswert unter 3V Wird ein Zähler um 1 erhöht und der Wert in den EEprom geschrieben. Es wenn der Wert wieder über 3V steigt wird die nächste Unterspannung "gewertet" und in den EEprom geschrieben. Die Messungen sind Timergesteuert (8bit Timer0). Sie lösen einen Overflow Interrupt aus. Sobald 600 Interrupts (~5sek) werden die Zellen gemessen. ====================================================================*/ #include <avr/io.h> #include <stdlib.h> #include <avr/eeprom.h> #include <avr/signal.h> #include <avr/interrupt.h> #include "avrlibdefs.h" #include "avrlibtypes.h" #include "a2d.h" #include "lcd.h" volatile uint16_t zelle[2]; //Varibale die von der Interruptroutine volatile uint16_t counter =0; //und auch von anderen Funktionen gelesen werden können int lcd_maske(void); //LCD Maske int lcd_put_f(uint16_t adc); //Funktion zum Anzeigen des Spannungswertes int timer_init (void); //Initialisieren des Timers int timer_init(void) //Initialisieren des Timers { TCCR0 = (1<<CS02); //Freq = F_CPU/256 TCNT0 = 0; //Counter = 0 TIMSK = (1<<TOIE0); //Enable Overflow Interrupts return(0); } int lcd_maske (void) //Aufbau der LCD Maske { lcd_init(LCD_DISP_ON); //LCD initialisiern lcd_home(); //lcd home lcd_clrscr(); //Clear Screen lcd_puts(" Unterspannungsanzeige"); lcd_gotoxy(0,1); lcd_puts("Zelle 1:"); lcd_gotoxy(0,2); lcd_puts("Zelle 2:"); return(0); } int lcd_put_f (uint16_t adc) //Zum anzeigen der Spannungen am Display { //ADC Wert wird in eine Spannung umgerechnet float ganzzahl,komma; uint8_t int_ganzzahl, int_komma; cli(); //Disable Interrupts ganzzahl = (adc/1024.0) * 5; komma = (ganzzahl - (int) ganzzahl)*100; sei(); //Enable Interrupts int_ganzzahl = (int)ganzzahl; int_komma = komma; lcd_put_d(int_ganzzahl); lcd_putc('.'); lcd_put_d(int_komma); lcd_putc('V'); return(0); } SIGNAL (SIG_OVERFLOW0) //Overflow Routine { counter++; // bei jedem Overflow counter++ if(counter == 600) //Wenn counter = 600 (~5sek) { counter=0; cli(); //Disable Interrupts zelle[0] = a2dConvert10bit(0); //Messen der Werte zelle[1] = a2dConvert10bit(1); sei(); //Enable Interrupts PORTD ^= (1<<0); //Led umschalten } } int lesen (void) //Lesefunktion zum Auslesen der Werte { cli(); //Disable Interrupts lcd_clrscr(); lcd_home(); lcd_puts("Auslesen der Werte"); lcd_gotoxy(0,1); lcd_puts("Niedrigster Wert Anzahl\n"); lcd_puts("Zelle 1:\n"); lcd_puts("Zelle 2:"); lcd_gotoxy(9,2); lcd_put_f(eeprom_read_word((uint16_t*) 2)); //Wert von Zelle 1 auslesen lcd_gotoxy(9,3); lcd_put_f(eeprom_read_word((uint16_t*) 4)); //Wert von Zelle 2 auslesen lcd_gotoxy(20,2); lcd_put_d(eeprom_read_byte((uint8_t*)0)); //Anzahl der Unterspannungen vo Zelle1 lcd_gotoxy(20,3); lcd_put_d(eeprom_read_byte((uint8_t*)1)); //Anzahl der Unterspannungen von Zelle2 loop_until_bit_is_set(PIND, PD7); //warten bis Schalter an PD7 wieder ausgeschalten ist. lcd_clrscr(); lcd_home(); lcd_maske(); sei(); //Enable Interrupts return(0); } int main (void) //Mainfunktion { uint8_t i, istpositiv[2], zaehler[2]; istpositiv[0] = 1; //Flag ob positiv istpositiv[1] = 1; zaehler[0] = eeprom_read_byte((uint8_t*) 0); //Zähler aus dem EEprom auslesen zaehler[1] = eeprom_read_byte((uint8_t*) 1); //Zähler aus dem EEprom auslesen if(zaehler[0] == 255) //Wenn Zähler =255 = 0xFF (nach dem Flashen) zaehler[0] = 0; //Zähler = 0; if(zaehler[1] == 255) zaehler[1] = 0; DDRC &=~ ((1<<PC0) | (1<<PC1)); //PC0, PC1 Eingänge PORTC &=~ ((1<<PC0) | (1<<PC1)); //disabke pullups DDRD &=~ (1<<7); //PD7 Eingang (schalter) PORTD &=~ (1<<7); //Disable pullups DDRD |= (1<<0); //PD0 Ausgang PORTD &=~ (1<<0); a2dInit(); //A2D initialisiern a2dSetPrescaler(ADC_PRESCALE_DIV32); //Prescaler = 32 a2dSetReference(ADC_REFERENCE_AVCC); //Refernzspannung = Versorgungsspanung lcd_maske(); timer_init(); //Timer initialisieren sei(); while(1) { cli(); if(bit_is_clear(PIND, PD7) == 1) //PD7 auf high geschalten ist lesen(); //Funktion lesen aufrufen (Auslesen der Werte) sei(); for(i=0; i <2; i++) //Auswerten der Messungen { if(zelle[i] > 614) //wenn Zelle > 3V { istpositiv[i] = 1; //Flag setzen } if(istpositiv[i] == 1) //Wenn Flag gesetzt { if(zelle[i] < 614) //Wenn zelle i < 3V { zaehler[i]++; //Zähler um eins erhöhen cli(); //Disable Interrups eeprom_write_byte((uint8_t*)i, zaehler[i]); //wert des Zählers in den EEprim schreiben eeprom_write_word((uint16_t*)((i*2)+2), zelle[i]); //Wert der Spannung in EEProm schreiben sei(); //Enable Interrupts istpositiv[i] =0; //Flag löschen } } } lcd_gotoxy(9,1); lcd_put_f(a2dConvert10bit(0)); //Spannungswert anzeigen lcd_gotoxy(9,2); lcd_put_f(a2dConvert10bit(1)); //Spannungswert anzeigen } return(0); }
Beim Auslesen wird immer 0.0V dargestellt. Bis ich den Wert ändere. Warum?
Danke im Voraus
Gruß Robert[/code]







Zitieren

Lesezeichen