Tobi Spr schrieb:
> Diese blinkt auch. Ob das Timing stimmt kann ich in diesem fall nicht so
> genau sagen, da es aufgrund der Zeit rasend schnell blinkt (optisch
> gesehen ist es nur ein Flimmern)
Dann nimm alle Zeiten zum Testen mal 100, dann kannst du auch mit der
Eieruhr ausmessen ob die Zeiten stimmen.
> Zu den 16Mhz: Ich bin mir nicht sicher. Aber ich dachte wenn am Atmega
> ein 16Mhz Quarz angeschlossen ist, und ich es im makefile so definiere
> müsste er ja auf 16Mhz laufen oder?
Du hast falsch gedacht. Du musst die Fuses umstellen.
> Zu dem Programm: Da hast du recht, dass man da Augenkrebs bekommen
> könnte! :D Ich wollte aber mit diesem Testprogramm weitere Fallen (zb
> Timingprobleme) vermeiden.
Es geht doch nicht um Timingprobleme
1 | void sendZero()
|
2 | {
|
3 | ...
|
4 | }
|
5 |
|
6 | void sendOne()
|
7 | {
|
8 | ...
|
9 | }
|
10 |
|
11 | void sendFloat()
|
12 | {
|
13 | ...
|
14 | }
|
und das was du senden willst realisierst du durch entsprechende Aufrufe
der Funktionen in der richtigen Reihenfolge.
Edit:
Das hier
1 | void sleep_us(uint16_t us)
|
2 | {
|
3 | for(; us > 0; us--)
|
4 | {
|
5 | _delay_us(1);
|
6 | }
|
7 | }
|
wird sowieso nicht genau. Benutze in den send.... Funktionen _delay_us
(fürs erste) und gut ists. Du hast deine 'Timingprobleme' an der völlig
falschen Stelle vermeiden wollen.
1 | #define OUT_DDR DDRD
|
2 | #define OUT_PORT PORTD
|
3 | #define OUT_BIT 6
|
4 |
|
5 | #define LONG_TIME 5064
|
6 | #define SHORT_TIME 1688
|
7 |
|
8 | void sendZero()
|
9 | {
|
10 | // Pegel am Ausgang 1 0 1 0
|
11 | // Dauer kurz lang kurz lang
|
12 |
|
13 | OUT_PORT |= (1 << OUT_BIT);
|
14 | _delay_us( SHORT_TIME );
|
15 |
|
16 | OUT_PORT &= ~(1 << OUT_BIT);
|
17 | _delay_us( LONG_TIME );
|
18 |
|
19 | OUT_PORT |= (1 << OUT_BIT);
|
20 | _delay_us( SHORT_TIME );
|
21 |
|
22 | OUT_PORT &= ~(1 << OUT_BIT);
|
23 | _delay_ms( LONG_TIME );
|
24 | }
|
dann kriegt man auch keinen Augenkrebs und kann Änderungen leicht
durchführen.
Und wenn du dann noch den Mega auf Quarzverwendung umfust, dann stimmen
auch die Zeiten (aber teste das unbedingt einzeln! Der Mega muss auch
auf 16Mhz laufen, wenn du darauf aufbauend die _delay_us dimensionierst!
Sich das einfach nur wünschen ist zu wenig).