Forum: Compiler & IDEs Hilfe bei implementierung eines Cricket Interfaces


von Bernd Klein (Gast)


Angehängte Dateien:

Lesenswert?

Moin AVR'ler,

ich habe ein großes Problem, das ich leider nicht gebacken bekomme. Mein 
Sohn besitzt eine HandyCricket (http://www.handyboard.com/cricket/) - 
Feines Teil. Als Erweiterung besitzt dieses Board einen Bus, der von 
externen Controllers zur Kommunikation genutzt werden kann.

Nun möchte ich ein IR-Interface für meinen Sohn bauen, bin aber zu blöd 
um das Softwareinterface für den Cricket-Bus zu implementieren. Es 
funtiioniert leider nicht.

Wichtig ist, das das Timing exakt stimmt - das ist zumindestens die 
Aussage der Cricket-community (die arbeiten alle mit PIC's). Gelesen 
werden 9 Bits + Startbit
Jede Bitsequenz ist exakt 10us lang. (siehe 
http://www.handyboard.com/cricket/tech/bus.shtml)

Hier ein Paar infos zu meinem Testsystem
ATTiny 26, interner Osc. auf 4Mhz

Die eigentliche "Lese-Methode" ist in Assembler geschrieben (übrigens 
mein erstes Assembler Programm - wahrscheinlich liegt es daran)

Ansonsten im Attachment gibt es eine README.TXT DAtei, da steht noch so 
einiges drin.

Wäre super, wenn ihr mir helfen könnt - die Zeit bis Weihnachten ist 
verdammt knapp !!

Gruß
Bernd

von Bernd Klein (Gast)


Lesenswert?

Mist, ich vergaß

Im AVRStudio (Simulator), ist die Zeit zwischen den einzelnen Bits exakt 
10us.

nochmals danke, falls einer oder mehrere mir bei meinem 
WEihnachtsgeschenk helfen !!!

von Frank B. (frank_b) Benutzerseite


Lesenswert?

Ohne das Programm angesehen zu haben:

Es könnte am internen Oszillator liegen.
Wenn die 10 us wirklich so genau sein müssen, solltest Du einen Quartz 
verwenden, der interne Oszillator ist nicht besonders genau.

Frank

von Gast1985 (Gast)


Lesenswert?

Hallo,

Also wenn du den Bus manuell auslesen willst warum einen Trigger auf 
Fallende Flanken ? Solltest du nicht mit einem Trigger auf steigende 
Flanke das 10µs Sync Bit erwischen und den 8 Bit Timer starten?

Vorteiler 1 und einen Output Compare auf 13. Dann liest du den Pin etwa 
3 mal,
also alle 3,33 µs aus (genau 3,25 mal aber bei 30 Samples kann man die 
Verschiebung vergessen). Somit kannst du die 3 Compares vergleichen und 
zum Beispiel sagen: 2/3 od. 3/3 = 1 also war das Bit 1 bei 0 
entsprechend andersrum.

Den bei einem Signal wie 11.0001.1000 würde erst nach dem 2. Bit eine 
fallende Flanke erkannt und dann wieder nach dem 7. Bit.

Zur minimierung des versatzes nach Sync Bit Timer und Compare frisch 
setzen und starten oder mit den Zählerstand spielen und Versuchen alle 
10µs neu Starten.

von Bernd Klein (Gast)


Lesenswert?

Hi (Gast)
1
warum einen Trigger auf
2
Fallende Flanken ? Solltest du nicht mit einem Trigger auf steigende
3
Flanke

Das Cricket zieht im Normalzustand den Bus auf 5V (high). Sobald es 
anfängt Daten zu senden wird der Bus für 100ms (sync-Phase) auf low 
gezogen (fallende Flanke). Nach 100us kommt ein Startbit (immer high) 
für 10us. Danach folgen die restlichen 9 Bits im 10us Abständen.

Mein gewählter Ansatz ist so:
INT0 auf fallende Flanke einstellen, dann auf Startbit warten. Sobald 
das da ist im 10us Intervall 9Bits einlesen.

Soweit zur Theorie - leider funzt der Kram in der Praxis mit meinem 
Progamm aber nicht :-(

Mit dem Timer ist eine Idee, muss ich mal ausprobieren

Gruß
Bernd

von Bernd Klein (Gast)


Lesenswert?

Problem ist gelöst !

Es lag tatsächlich am timing. Die Benutztung eines internen Oszillators 
bei einem exakten Timing (10us) ist wohl entweder nicht möglich oder 
sehr schwierig. Nach Einsatz eines 4Mhz Quarzes funktioniert der Kram

Danke für die Tips
Bernd

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.