Langsam weiß ich nicht mehr weiter.
Ich möchte, wie in der Überschrift beschrieben eine bzw. zwei LED dimmen
(später sollen die LEDs mit 2 Pumpen und Fet getauscht werden).
Dazu möchte ich ein Poti verwenden. Die Funktion des ADC sollte
funktionieren, da ich mit einer Abfrage 4 LEDs leuchten lasse (je
nachdem, welcher Wert ansteht).
Der Timer1 wird für einen andere Aufgabe benötigt und wird daher auch
verwendet.
Also verstanden habe ich deine Antwort, da ich bisher mir den Quelltext
immer zusammengesucht habe und so langsam mir die Fakten anlese, weiß
ich jedoch nicht wirklich, wie ich dem abhilfe schaffen kann.
Denke eher er meint das du den Timer interrupt einfügen solltest.
Was mir noch auffällt das ganze AD Wandler auslesen solltest du im
Hauptprogramm machen und im Interrupt von Timer 1 dann nur den Wert
nutzen, falls du das zyklisch mit diesem machen willst.
Aber wenn ich die AD-Wandlung im Hauptprogramm ablaufen lasse, dann wird
diese doch nur einmal ausgeführt, oder wie kann ich diese Funktion in
die While-Schleife einbauen?
Ich wollte sowie so gerne aus ein paar Abschnitte Teilprogramme
erstellen, da ich die AD-Wandlung z.B. für 3 Ports benötige. Ich bin
damit jedoch etwas überfragt. Gerne würde ich Quelltexte und nicht nur
Ratschläge von euch bekommen, da es mir schwer fällt, z.B.
> das du den Timer interrupt einfügen solltest.
zu deuten.
Squat *** schrieb:> Aber wenn ich die AD-Wandlung im Hauptprogramm ablaufen lasse, dann wird> diese doch nur einmal ausgeführt, oder wie kann ich diese Funktion in> die While-Schleife einbauen?
Das ist jetzt aber nicht dein Ernst, oder?
Ich empfehle das Zusammenstoppeln von geklautem Code zu unterlassen und
erst mal mit einem guten Buch die ersten Gehversuche in richtigem
Programmieren auf einem PC zu machen.
Les dir mal das AVR-GCC Tutorial hier auf der Seite durch und arbeite
das mal ab. Da hast du mehr von als blind den Quelltext
zusammenzusuchen. Vor allem vereinfacht das die Fehlerfindung und
Behebung um einiges.
Ich wollte an dieser Stelle von niemandem Tipps, wie ich grundsätzlich
hier was lernen kann.
Vielleicht habe ich mich falsch ausgedrückt.
Entschuldigt Bitte.
Natürlich habe ich mich belesen. Neben den "AVR-GCC Tutorial" und den
Grundlagen aus dem "AVR-Tutorial" habe ich noch "AVR - Hardware und
C-Programmierung in der Praxis", sowie PROGRAMMIEREN IN C oder
C-Programmierung unter Linux/UNIX/Windows durch gearbeitet. Daher habe
ich neben dem Datenblatt auch das grundsätzliche Gerüst.
Ich weiß ja nicht wie Ihr lernt, aber ich lerne ganz viel durch
ausprobieren. Und so bin ich auch soweit gekommen, habe den ADC ans
laufen bekommen und kann diesen über 4 LEDs signalisieren, ein
Rundumlicht aus 4 Lämpchen, eine Jumper-Abfrage sowie das Ansteuern
eines Servos.
Was mir jetzt noch fehlt sind ein paar C-Grundlagen, die nach und nach
erarbeitet werden sowie weitere Hardwarefunktionen.
Und darum geht es hier. Benötige Hilfe bei der obengenannten
Aufgabenstellung und wäre für jeden aufschlußreichen Hinweis dankbar.
Und danke an MWS und Frederik Krämer für die ersten Hilfestellungen.
Schau Dir das DB an, dann weist Du warum.
Wobei auch ich sagen muss, Dein Code ist schwer zu lesen, und dann fällt
erfahrungsgemäß die Hilfe geringer aus, wenn sich da erst jemand
umständlich durchpflügen muss.
Vielen Dank.
Und schon wieder konnte ich was lernen. War mir garnicht bewusst, dass
die Parametisierung über zwei Register geht. Aber dank eurer Hilfe und
dem Datenblatt habe ich es nun verstanden.
Mich würde noch interessieren, was zu schwer zu lesen ist. Ist das zu
viel Quelltext oder schlecht kommentiert oder liegt es an dem
Programmaufbau.
Eine Frage hätte ich jedoch noch. Die LED geht nicht ganz aus. Das wäre
mit der Pumpe dann genauso. Woran liegt das?
Der vollständigkeitshalber hänge ich hier nochmal den funktionstüchtigen
Quelltest an.
Squat *** schrieb:> Mich würde noch interessieren, was zu schwer zu lesen ist.
Vieles.
zb
welche Bits werden hier gesetzt?
1
TCCR0A=0xA3;
2
TCCR0B=0x04;//start timer
Was bedeuten sie? Warum werden sie gesetzt?
1
voidtimer1_ovf_isr(void)
2
{
3
//TIMER1 has overflowed
4
TCNT1H=0xCF;//reload counter high value
5
TCNT1L=0x2C;//reload counter low value
Kann dein Compiler die beiden TCNT1 Register zu einem logischen 16 Bit
Regsiter zusammenfassen? Im gcc geht zb das
1
TCNT1=0xCF2C;
damit erhebt isch aber sofort die Frage: Huch 0xCF2C. Was'n das?
1
TCNT1=53036;
Damit aber sofort die nächste Frage: Warum ausgerechnet dieser Wert,
warum kein anderer? Wo kommt der Wert her? Wenn ich meine Taktfrequenz
ändere, muss ich den anpassen? Wie muss ich den anpassen? Kann ich das
nicht am besten so fomulieren, dass der Compiler mir den Wert
ausrechnet, wenn ich ihm Taktfrequenz und gewünschte Zeit angebe?
Die Kommentare
1
voidtimer1_ovf_isr(void)
2
{
3
//TIMER1 has overflowed
4
TCNT1H=0xCF;//reload counter high value
5
TCNT1L=0x2C;//reload counter low value
sind zwar ein netter Versuch, mehr aber auch nicht. Das da das High Byte
vom Counter beschrieben wird, sehe ich auch im Code. Dazu brauch ich
keinen Kommentar. Viel interessanter: Warum ausgerechnet mit diesem
Wert?
Das hier
1
for(i=0;i<4;i++)
2
{
3
ADCSRA|=(1<<ADSC);// Messung ausfuehren
4
while(ADCSRA&(1<<ADSC));// Konvertierung abwarten
5
result+=ADC;// aufaddieren zur Mittelwertbildung (ADC auslesen der zwei Bits
6
}
7
ADCSRA&=~(1<<ADEN);// ADC ausschalten
8
9
result/=16;//
ist nicht unmittelbar logisch. Du machst 4 Messungen, dividierst die
Summe der Messungen aber durch 16. Programmfehler? (Ich weiss schon, das
du auf einen Wertebereich 0..255 runterkommen willst. Aber dazu muss ich
den Rest der Funktion lesen, bis mir das dämmert)
Was soll das sein?
1
if(blink_state=0)
2
{}
3
if(blink_state=1)
4
{}
5
if(blink_state=2)
6
{}
1
PORTD&=~0x15;// PD4, PD2 &PD0 low
2
PORTD|=0x08;// PD3 high => LED an
Super. Das PD4, PD2, PD0 auf low geschaltet werden, seh ich auch im
Code. Aber warum?
Deine Konstanten für 'Welche LED hängt wo' sind quer über den ganzen
Programmtext verstreut.
Denkst du nicht, dass
>Ist das zu viel Quelltext oder schlecht kommentiert oder liegt es an dem>Programmaufbau.
Genau. Später dann frag' nochmal. Da kommt noch mehr dazu.
>Ich wollte an dieser Stelle von niemandem Tipps, wie ich grundsätzlich>hier was lernen kann.
Schon, aber wir sind sowas von kommunikativ hier... Du hast's nötig. Und
wie willst Du das verhindern? Ätsch.
>Natürlich habe ich mich belesen. Neben den "AVR-GCC Tutorial" und den>Grundlagen aus dem "AVR-Tutorial" habe ich noch "AVR - Hardware und>C-Programmierung in der Praxis", sowie PROGRAMMIEREN IN C oder>C-Programmierung unter Linux/UNIX/Windows durch gearbeitet.
---> 6. 3.
-----------------------------------------------
1. Manche Posts sollte man nicht beantworten.
2. Manche Antworten sollte man ignorieren.
3. Manche Texte sollte man zweimal lesen.
4. Manche Programme sollte man zweimal schreiben.
6. Ach! (Loriot)
7. Ich bin doch klüger, besser, länger, schöner als Du, egal was Du
sagst.
8. Google
Hi
>Was mir jetzt noch fehlt sind ein paar C-Grundlagen, die nach und nach>erarbeitet werden sowie weitere Hardwarefunktionen.
Da fehlt auch noch etwas Verständnis für den Controller.
>void adc_init(void)>{> ADCSRA = 0x00; //disable adc> ADMUX = 0x00; //select adc input 0> ACSR = 0x80;> ADCSRB = 0x00;> ADCSRA = 0x01;>}
Das ist keine Init. Bis auf zwei irrelevante Bit sind das die Zustände
nach einem Reset. Hier solltest du die Einstellungen machen, die sich
im Programm nicht mehr ändern. Also Referenzspannungsquelle,
Prescaler... .
Dann kannst du die die ständige Neuinitialisierung und den Dummyread im
Timerinterrupt sparen.
>Eine Frage hätte ich jedoch noch. Die LED geht nicht ganz aus. Das wäre>mit der Pumpe dann genauso. Woran liegt das?
Am Non-Inverting-Mode. Wenn du wirklich auf Null herunter willst nimm
den Inverting Mode
MfG Spess
spess53 schrieb:> Am Non-Inverting-Mode. Wenn du wirklich auf Null herunter willst nimm> den Inverting Mode
Oder man schaltet im Fall "Null" einfach die PWM ab.
Gruß,
Frank