Forum: Mikrocontroller und Digitale Elektronik ATTINY84A ADC stürzt ab


von Primex (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

eine LED wird via PWM angesteuert. Der PWM Dutycycle richtet sich nach 
einem ADC Eingang. Die LED wird solange nachgeregelt, bis der ADC den 
Wert 512 (2,5V) ausgibt.

Nun das Problem: Wenn die LED bis 100% angesteuert wird und dann wieder 
heruntergeregelt wird (die Photodiode wird ins Licht gehalten) 
verringert sich die PWM Frequenz. jedoch stürzt der ADC an einem nahezu 
beliebigen Punkt dabei ab und das ganze System bleibt stehen. Es wird 
weder hoch noch heruntergeregelt. Allerdings reagiert der µC noch auf 
Interupts.

Das ganze habe ich schon mit mehreren verschiedenen Boards getestet. Das 
Programm lief schonmal, allerdings ging es verloren. Mein "Neubau" 
stürzt ab.

Erkennt jemand woran das liegen kann?

von Achim K. (aks)


Lesenswert?

1
while (pd_value != poti_value)  
2
   //Check for Brightness is unequal to 128,   which is the desired value
3
{
4
    pd_value = (adc_byte2 | (adc_byte1 << 8));
5
...

Wenn ich nichts übersehen, wird pd_value nicht mehr neu aus den 
adc_bytes ausgelesen, sobald es einmal poti_value ist. Damit ist dann 
while immer false und das Verhalten würde zur Beschreibung passen.

von Peter II (Gast)


Lesenswert?

Und das das cli und sei in der ISR weg.

Bei einem Atmel sind alles Interrupts gesperrt wenn einer ausgeführt 
wird. Es bringt also nichts und im schlimmsten fall bekommt du ein 
Stackoverflow.

ein _delay_ms hat dort auch nicht zu suchen, aber dafür musst du mehr 
umschreiben.

von Thomas E. (thomase)


Lesenswert?

1
#define interrupt_flag GIFR //FLAG register
2
#define interrupt_mask GIMSK //Masking 
3
#define pinchange0 PCMSK0 //Interrupt on PCMSK1 Vector
4
#define pinchange1 PCMSK1 //Interrupt on PCMSK1 Vector
5
#define sense_control MCUCR //Sense control for PCINT0
6
7
#define power_reduction PRR
8
9
#define timer0_value TCNT0 //8 Bit Timer0
10
#define timer0_modus TCCR0A //Byte for modus of Timer0
11
#define timer0_prescaler TCCR0B //Byte for the prescaler of Timer0
12
13
#define adc_setting ADMUX//Byte of the settings of the ADC Channel(s)
14
#define adc_control_status ADCSRA//Byte of the control and status of the ADC
15
#define adc_byte1 ADCH //HIGH Byte of the ADC
16
#define adc_byte2 ADCL //LOW Byte of the ADC

Was soll denn dieser Quatsch?
Daß man einen Portpin z.B. als LED1 oder Taste7 definiert, ist 
selbstverständlich. Aber was soll es Register, bei denen jeder weiß, daß 
es sich um die ADC-Register handelt, als adc-byte1 und adc_byte2 zu 
definieren? Zumal der Compiler mit "pd_value = ADC;" wunderbar 
klarkommt.
Das selbe gilt für die anderen Register, deren Bezeichnung 
selbsterklärend sind.

Was ist //Sense control for PCINT0?
Und natürlich das behornte (0 << Sonstwas).

Schreib das Programm erstmal lesbar. So ist das eine Zumutung. Für 
bestimmte Sachen sind #defines sehr hilfreich. Aber man sollte es nicht 
übertreiben.

mfg.

: Bearbeitet durch User
von Primex (Gast)


Lesenswert?

Die ganzen Defines waren für mich zum Einstieg. Zu dem zeitpunkt waren 
die ganzen Registernamen mir noch nicht geläufig. Das fliegt raus!

Das (0<<X) dient zu experimentierzwecken (bin unerfahren) und 
erleichtert mir so fixe Änderungen (on 0 auf 1) :)

Wird für den finalen Code ebenfalls entfallen.

@ Peter:
Der Pin in der ISR soll für die x ms auf high gezogen werden (lässt die 
LED für x ms sehr hell leuchten - Blitzen-), dafür der Delay. Gibt es da 
auch eine "elegante" Variante zu?

@Achim:
Besten Dank, die einfachen Sachen übersieht man doch am schnellsten! :)

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.