Hi, ich bin blutiger Anfänger was die Programmierung von AVR Chips angeht und wollte fragen ob es eine gesammelte Quelle an aufbereiteten Informationen gibt. Ich kenne das beispielsweise vom Pi Pico als SDK, oder, wenn auch ein etwas anderer Usecase, von der JAVA APi. Ich frage, weil ich jetzt schon seit über einer Stunde daran scheitere, einen simplen Timerinterrupt zum laufen zu bekommen. Ja, die Daten stehen im Datenblatt, aber das ist ja nicht wirklich anfängerfreundlich zu lesen. Tut mir leid, wenn das als blöde Frage gilt Danke für eure Ratschläge
die "blutige Anfänger API" für AVR µCs nennt sich "Arduino" :)
Dann suche ich etwas für "ein Schritt nach blutiger Anfänger"
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
Adam P. schrieb: > https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR Diesen Beitrag habe ich schon gefunden und habe versucht ihn zu befolgen. Leider hab ich das nicht zum laufen bekommen. Ich nutze einen Atmega1284p, falls das einen Unterschied macht
Sowas vielleicht? https://github.com/jfpoilpret/fast-arduino-lib für C++ - Enthusiasten. Da hast du dann Code wie
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
(Ganzer Code: https://github.com/jfpoilpret/fast-arduino-lib/blob/master/tuto-samples/fastarduino/timer_1_ctc.cpp ) Deutlich mehr Tipparbeit als die handvoll Register von Hand zu setzen, aber "cleaner"?
Gast
#6979269
David P. schrieb: > Leider hab ich das nicht zum laufen bekommen. Wenn du weiterkommen willst dass müsstest du uns eben zeigen was du schon gemacht hast und welche Probleme dabei auftauchen. So richtig gute Hellseher sind wir hier alle nicht ....
David P. schrieb: > Ich nutze einen > Atmega1284p, falls das einen Unterschied macht Ja da heißen die Register ein wenig anders.
Gast
#6979282
David P. schrieb: > aber das ist ja nicht wirklich anfängerfreundlich zu lesen. Wo ist denn das Problem? Atmel-Datenblätter sind verhältnismäßig gut. Vor allem ist es ein Dokument pro Chip-Gruppe; nicht wie bei STM32, wo es ein Datenblatt, ein Reference- und ein Programming-Manual mit jeweils zig-tausend Seiten gibt.
Gast
#6979299
David P. schrieb: > die Daten stehen im Datenblatt, > aber das ist ja nicht wirklich anfängerfreundlich zu lesen. Dur wirst keine "schöneren" Datenblätter finden, als die von AVR Mikrocontroller. > Dann suche ich etwas für "ein Schritt nach blutiger Anfänger" http://stefanfrings.de/mikrocontroller_buch/index.html Die Timer sind allerdings schon recht komplex. Am besten fängst du erst mal mit einfacheren Funktionen an, bis du mit dem Style des Datenblattes vertraut bist. Mein "Buch" leitet dich dazu an.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
Das ist der Code, den ich mir aus dem Internet zusammengesucht habe. Wenn ich das richtig verstehe, sollte die LED, die an PD1 angeschlossen ist jetzt schnell blinken oder "halbhell" leuchte, allerdings bleibt sie aus.
Gast
#6979350
Mal die Warnungen im Compiler ('-Wall') einschalten - bei mir kommt da
ein "... appears to be a misspelled signal handler ...".
Gast
#6979351
1 | |
das sollte wohl eher
1 | |
heissen!
STK500-Besitzer schrieb: > das sollte wohl eherPORTD &= ~(1<<1); > heissen! Hab ich geändert, aber da gar keine LED an geht, ist das wohl nicht das Problem S. Landolt schrieb: > Mal die Warnungen im Compiler ('-Wall') einschalten - bei mir kommt da > ein "... appears to be a misspelled signal handler ...".
1 | |
Die Zeile hab ich geändert, entfernt die Warnung, tut sonst aber nichts
Gast
#6979365
David P. schrieb: > Die Zeile hab ich geändert, entfernt die Warnung, tut sonst aber nichts kannst du die LED auch ohne Timer ansteuern? Einfach mal eine Endlosschleife in der die LED ein- und ausgeschaltet wird. Dazu dann noch ein paar Warteschleifen. So kann man zumindest Hardware-Fehler ausschließen.
STK500-Besitzer schrieb: > David P. schrieb: >> Die Zeile hab ich geändert, entfernt die Warnung, tut sonst aber nichts > > kannst du die LED auch ohne Timer ansteuern? > Einfach mal eine Endlosschleife in der die LED ein- und ausgeschaltet > wird. > Dazu dann noch ein paar Warteschleifen. > So kann man zumindest Hardware-Fehler ausschließen. Jap, das funktioniert. Dafür hatte ich die auskommentierte While Schleife benutzt.
Gast
#6979370
TCCR0B = (1<<CS00); nicht TCCR0A
S. Landolt schrieb: > TCCR0B = (1<<CS00); > nicht TCCR0A Das war der Fehler, danke
Gast
#6979383
Vorsicht vor Fehlinterpretationen: die LED blinkt mit 250 Hz. Und Helligkeiten täuschen oft.
David P. schrieb: > #define F_CPU 128000L Bist du sicher das das so richtig ist, auch wenn es nichts mit deinem Problem zu tun hat? Also du hast nun den Timer mit dem TIMER0A_OVF_vect Interrupt verwendet, hier noch mal ein Bsp. mit TIMER0_COMPA_vect. Den Pin musst halt auf den richtigen ändern.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
Adam P. schrieb: > #define F_CPU 128000L steht doch für 128KHz oder? Wenn ja, sollte es richtig sein.
Mitlerweile habe ich meinen Code soweit geändert. Die Anzgeige auf Port d klappt, die auf PortA gar nicht und auf PortC die ersten 2 Bits. Jemand ne idee, woran das liegen könnte?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
David P. schrieb: > PORTA=stunden; Dann musst du halt auch mindestens 1 Std. warten.
Gast
#6979448
David P. schrieb: > Mitlerweile habe ich meinen Code soweit geändert. Die Anzgeige auf Port > d klappt, die auf PortA gar nicht und auf PortC die ersten 2 Bits. > Jemand ne idee, woran das liegen könnte? ja, Infos zu den Ports findest du im Datenblatt. Da der Code ja inzwischen umfangreicher wird, solltest du ihn als Anhang mitliefern.
Adam P. schrieb: > David P. schrieb: >> PORTA=stunden; > > Dann musst du halt auch mindestens 1 Std. warten. Um das ganze zu testen, habe ich den CPU Takt erhöht, sollte also deutlich weniger als ne stunde dauern STK500-Besitzer schrieb: > Da der Code ja inzwischen umfangreicher wird, solltest du ihn als Anhang > mitliefern. Mache ich in Zukunft.
Dann versuch es doch mal so: PORTD = sekunden; PORTA = sekunden; PORTC = sekunden;
Gast
#6979465
PORTC2..5 wird von JTAG benutzt - ist das abgeschaltet?
Ändert leider nichts. PORTA ist komplett aus, Bei PORTC funktionieren die ersten 2 Bits, der rest leuchtet sehr schwach
S. Landolt schrieb: > PORTC2..5 wird von JTAG benutzt - ist das abgeschaltet? Nein, noch nicht. Danke für den Tipp, ich schaue mal nach, wie das geht
Und mach Mal vor die Variablen die im Interrupt Context verwendet werden ein volatile davor.
S. Landolt schrieb: > PORTC2..5 wird von JTAG benutzt - ist das abgeschaltet? Aber nicht das er nur ein JTAG Adapter (Kabel) hat, sonst wars das dann mit wieder ändern.
Gast
#6979470
> PORTA ist komplett aus
Ist AVcc angeschlossen, d.h. mit Strom versorgt?
S. Landolt schrieb: > Ist AVcc angeschlossen, d.h. mit Strom versorgt? Jetzt ja, und schon funktioniert PortA
S. Landolt schrieb: > Ist AVcc angeschlossen, d.h. mit Strom versorgt? Man lernt nie aus...das wusst ich auch noch nicht. Ich bin davon ausgegangen das AVcc lediglich für den Analog Teil ist, nicht das es auch "grundsätzlich" den PORTA versorgt. Edit: AVCC is the supply voltage pin for Port F and the Analog-to-digital Converter. It should be exter- nally connected to VCC , even if the ADC is not used. If the ADC is used, it should be connected to V CC through a low-pass filter.
Gast
#6979557
> Aber nicht das er nur ein JTAG Adapter (Kabel) hat, > sonst wars das dann mit wieder ändern. Man muss ja nicht per Fuse abschalten, per Software (zu Programmbeginn) geht auch.
S. Landolt schrieb: > Man muss ja nicht per Fuse abschalten, per Software (zu Programmbeginn) > geht auch. Sollte das nicht mit dieser Zeile funktionieren?
1 | |
Gast
#6979614
Zweimal. "The application software must write this bit [JTD] to the desired value twice within four cycles to change its value.
S. Landolt schrieb: > "The application software must write this bit [JTD] to the desired value > twice within four cycles to change its value. Ah danke, das muss ich überlesen haben. Edit: Klappt, danke
David P. schrieb: > Adam P. schrieb: >> #define F_CPU 128000L > > steht doch für 128KHz oder? > Wenn ja, sollte es richtig sein. Darf ich fragen, warum du den Controller so langsam laufen lässt?
Adam P. schrieb: > Darf ich fragen, warum du den Controller so langsam laufen lässt? Zum Strom sparen. Ich wollte es mal so niedrig wie möglich probieren, wenn das von der rechenleistung nicht reicht, kann ich ja immer noch mehr nehmen
David P. schrieb: > Zum Strom sparen. Dann lässt man ihn eher normal schnell laufen und benutzt den sleep-Mode wann immer es geht.
Rentieren sich sleep modes, wenn man etwas im Sekundentakt machen möchte?
Gast
#6980890
Da es hier offenbar um eine Uhr geht, uneingeschränkt: ja. Aber auch sonst sehr oft, zumindest von der Verarbeitungskapazität her gesehen; allerdings sind viele Peripherieeinheiten dann abgeschaltet.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.