Forum: Mikrocontroller und Digitale Elektronik Tiny48 ADC und Interrupt


von Clemens H. (Firma: Stahl AG) (clemensh)


Lesenswert?

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
Noch kein Account? Hier anmelden.