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
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 !!!
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.