Hallo ich würde gerne für einen PIC32 die Tasten enptrellen.
Als Beispielcode habe ich mir den COde aus dem Forum rausgesucht. Dieser
ist eigentlich auch verständlich. Weiterhin habe ich versucht diesen auf
den PIC anzugelichen. Der Code sieht in etwa wie folgt aus:
Das funktioniert leider noch nicht wie gewünscht.
Wenn ich den Taster über if(!PORTReadBits(IOPORT_C, BIT_3)) anfrage
funktioniert es hingegen tadellos!
Falls Jemand schon mit dem PIC gearbeitet hat oder wem direkt etwas am
Code auffällt wäre ich dankbar
Isildur schrieb:> if(!PORTReadBits(port, bits))> {> if(PORTReadBits(port, bits))> {
Hier hast du nur ein Zeitfenster von wenigen µs, das du mit deiner
steigenden Flanke treffen musst damit sie erkannt wird.
Wird die Funktion eigentlich periodisch aufgerufen?
Ist es ein Taster mit Pullup oder Pulldown?
Isildur schrieb:> Der Code sieht in etwa wie folgt aus:> unsigned char debounce(IoPortId port, unsigned int bits)
Da hilft nur wegschmeißen und was funktionierendes nehmen
(Timerinterrupt).
Ich hab versucht beim PIC 32 die Delay_ms über TIMRE zu realisieren
(nach BeispielCode): Wenn ich den Timer bis 39062 hochzählen lasse
sollte ich 1 s haben, wenn ich folglich nur bis 39 hochzähle 1ms!
Selbst wenn ich 1s versuche über eine toogelnde LED zu referenzieren,
blinkt diese deutlich schneller.
Hat Jemand Erfahrung mit Delay Routinen für den PIC 32 oder kann kemand
was zu der Realisierung mit Timer unten sagen?
Isildur schrieb:> Selbst wenn ich 1s versuche über eine toogelnde LED zu referenzieren,> blinkt diese deutlich schneller.
Kannst du dieses 'deutlich' schneller mal etwas quantifizieren?
2 mal, 5 mal, 8 mal, 16 mal?
Wenn du das nicht gut schätzen kannst, dann geh halt mal länger als 1s
und zähl mit der Uhr in der Hand, wieviele Blinker du in zb 30 Sekunden
siehst.
> // Timer1Clock = 80 MHz / (256*8) = Fosc / (PB_Div*Prescale) = 39062> Hz -> 39062 wird Interrupt pro Sek. ausgeführt
Ohne jetzt mit so ein PIC jemals etwas zu tun gehabt zu haben, aber die
8 kann ich im Code zb nicht entdecken. Sind die eine Konstante?
Ist dein 'deutlich schneller' zb ein Faktor 8?
ist fehlerhaft. Die 8 hat damit nichts zu tun. Der Takt müsste sich über
10 MHz / 256 berechnen. -> Daher bis 39062 hochzählen für 1s, zumindest
in der Theorie. Problem ist, wenn ich dieses Wert beispielsweise
ver60fache "flackert" die LED immer noch mit derselben Frequenz.
Vermutlich hat sich noch ein Fehler in den Timer Einstellungen
eingeschlichen
Isildur schrieb:> Der Code sieht in etwa wie folgt aus:
Sowas ist ein ganz grobes Foul.
Code zu dem man Fragen hat, darf nie in etwa sein.
Wie soll Dir denn jemand helfen, wenn Du ungetesteten Fantasiecode
einstellst?
Isildur schrieb:> Ich hab versucht beim PIC 32 die Delay_ms über TIMRE zu realisieren
Dadurch wird die Routine auch nicht besser. Das Problem sind die
100..200ms Zwangspause bei jedem Aufruf, das ist und bleibt Quark.
> Dadurch wird die Routine auch nicht besser. Das Problem sind die> 100..200ms Zwangspause bei jedem Aufruf, das ist und bleibt Quark.
Ok, das hilft mir schon einmal. Die Idee hab ich ja hier aus dem Forum
und sogar schon einmal mit einem Atmel erfolgreich realisiert. Deswegen
war ich verwundert, dass ich bei den PICs scheinbar auf Schwierigkeiten
stoße und daraus geschlossen, dass der Fehler bei der Delay Funktion
liegt und nicht bei der eigentlichen Funktionsrealisierung!