Hallo Zusammen, mein erstes Projekt mit dem Tiny48 und C als Programmiersprache hat sich als einiges schwieriger herausgestellt als gedacht. Vielleicht kann mir hier ja Jemand weiterhelfen. Es handelt sich um eine Batterieüberwachung mithilfe eines Tiny48. Spannung, Temperatur usw sollen verarbeitet werden. Hardware passt soweit, aber bei der Software gibts noch zwei Hürden: Zum einen löst der PC Interrupt von PC7 nicht aus. Code dazu: //Reset Interrupt PIN PC7 Initialisieren////// PCICR |=0b00001111; //PCICR |=(1<<PCIE0);//PCINT7-0 an //PCMSK0 |=(1<<PCINT7);//Auswahl, PIN PC7 als interruptquelle sei();//global interrupt an ISR(PCINT0_vect) { Fehler=0; eeprom_write_byte((uint8_t*)0x10,5);//Fehlertyp=5,AllesOK resett PORTD=0b00001111; PORTD=0b11111111; } ______________________________________________________________________ _ Zum zweiten will der ADC noch nicht richtig, gibt Werte zwischen 0 und Maxwert 1024 aus, aber meistens so, das meine if Abfrage, selbst mit verschiedenen Werten, eintrifft: //Alle I/O Ports auf Eingang/Ausgang////////// DDRB = 0b00000110;//Relais Ausgang PB1/2 DDRC = 0b00000000;//PC6 zum Programmeingang PC7 resett eingang PORTC = (PORTC&0b01111111); // pull down PC7 PORTD = (PORTD&0b10111111); // pull down -> offen //////////////// ADC initialisieren ///Initialisierung mit 0 ///////////// uint8_t ADC_init() { ADCSRA |= (1<<ADEN);//ADC aktivieren ADCSRA |= (1<<ADPS1) | (1<<ADPS0); // clock/8 Frequenzvorteiler ADPS2=8; ADMUX |= (1<<ADLAR); //Left adjust result // ADC Wert lesen und verwerfen ADMUX = (ADMUX & (0b11110000)) | (Kanal & 0b00001111); //MUX0-5 ADCSRA |= (1<<ADSC); // eine ADC Wandlung starten while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten return ADCW; } //////////// ADC Einzelmessung /////////////////////////// uint16_t ADC_Read(uint8_t Kanal) { ADMUX = ((ADMUX & 0b11110000) | (Kanal & 0b00001111)); //MUX0-5 ADCSRA |= (1<<ADSC); // eine ADC Wandlung starten while (ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten return ADCW; // ADC auslesen und zurückgeben } Der Aufruf aus der main() : Kanal=1; do { if(ADC_Read(Kanal)>=255) {PORTD=0b00000110;} } while(1);
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.