Autor Thema: Externe Clock Source für den dsPIC33F nutzen [gelöst]  (Gelesen 9304 mal)

Offline corpsman

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
    • Corpsman Delphi / Lazarus Page
Externe Clock Source für den dsPIC33F nutzen [gelöst]
« am: Mai 23, 2011, 17:25:15 Nachmittag »
Hallo alle miteinander,

wie es mein Status schon zeigt, bin ich ein absoluter Newbie ;).

Dennoch habe ich schon einiges erreicht:

Ich habe mir einen dsPIC33F128GP310A zugelegt diesen habe ich erfolgreich auf eine Experimentierplatine gelötet und in betrieb genommen (Programiert mit ICD 3 und MPLAB). Anschließend habe ich das gute Stück mit einem Display versorgt und dieses via Digitaler Ein und Ausgänge angesteuert. Ebenfalls ein Paar Taster ( mit HW-Entprellung ) dazu und schon habe ich mir mein eigenes Eval Board gebastelt.

All das Funktioniert auch wunderbar.

Dann dachte ich mir eigentlich sollte ich mal hergehen und den dsPIC richtig Takten.

Also habe ich an SOSCO, SOSCI einen 32 kHz Resonator und an OSC1, OSC2 einen 40 MHZ Resonator jeweils mit entsprechenden Kondensatoren und Widerständen gelötet.
Die CPU will ich mit 40 MHZ Takt benutzen der 32kHz Resonater soll nachher 10 ms , und 1 s Interuppts erzeugen.

So viel zu meinen Wünschen.

Was ich getestet habe :

Mittels _SFOSCSEL und _FOSC ( Konfiguration per Source ganz zu beginn der Main.c ) kann ich die beiden Resonatoren zum Schwingen bringen und dies auch mit dem Oszilloskop messen.

Ein Togglen eines Ausgangspins und dieses Toggeln aufgenommen mit dem Oszilloskop zeigt mir, dass ich es auch schaffe dass die unterschiedlichen Resonatoren als CPU-Takt genommen werden.

Allerdings und hier ist mein Problem im Verhältnis 1:1000. Sprich nutze ich den 32Khz als Quelle toggelt mein Ausganspin mit 32 HZ und entsprechend bei 40 MHz mit 40 kHz.

Irgendwie drängt sich mir nun der Gedanke auf dass ich etwas noch nicht Richtig konfiguriert habe. Aus dem Datenblatt werde ich aber irgendwie auch nicht mehr schlauer.

Eine Google suche hat mich in euer Wiki geführt, doch leider ist das Thema Konfiguration hier noch nicht fertig gestellt.

Könnt ihr mir evtl. Trotzdem Helfen ?

Also, wie bekomme ich es hin das meine CPU mit 40 Mhz taktet, der Externe Takt also 1:1 übernommen wird ? Welche Register außer den beiden oben genannten muss man hier noch setzen ?

Gruß

Corpsman

« Letzte Änderung: Mai 24, 2011, 14:22:51 Nachmittag von corpsman »
--
Just try it

Offline Coltfisch

  • Hero Member
  • *****
  • Beiträge: 501
    • Profil anzeigen
    • BASE 32
Re:Externe Clock Source für den dsPIC33F nutzen
« Antwort #1 am: Mai 24, 2011, 09:47:07 Vormittag »
Tach!

Scheint fast so, als hättest Du vergessen den Code anzuhängen.
Könnte hier für eine fundierte Analyse des Problems hilfreich sein  ;)

Gruß

Offline corpsman

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
    • Corpsman Delphi / Lazarus Page
Re:Externe Clock Source für den dsPIC33F nutzen
« Antwort #2 am: Mai 24, 2011, 10:05:20 Vormittag »
Ups,

Hier das von mir auf das Problem reduzierte Programm.

In der Version wie ich sie Hochlade habe ich es immerhin schon auf 4 MHZ geschafft. ( siehe main.c Version 3 )

Sobald ich den dsPIC rechnen lasse ( Version 1 und 2 ) bricht die Geschwindigkeit dann auf 0,5 MHZ ein

Alles gemessen mit einem Oszilloskop

[Edit]

So ich hab nun mal mit frischen "Augen" auf das Problem geschaut.

Auf dem Oszi sehe ich meine LED ist 50 ns an und 150 ns aus.
Laut Assembler View von MPLAB mache ich

Takt| Befehl
n   : Port an
n+1 : nop
n+2 : Port aus

d.h. meine LED leuchtet genau 2 Befehle => 1 Befehl = 25ns => Taktung = 40 MHz

Das bedeutet, dass eigentlich alles schon wunderbar funktioniert, oder hab ich einen Denkfehler ?
« Letzte Änderung: Mai 24, 2011, 11:20:28 Vormittag von corpsman »
--
Just try it

Offline Coltfisch

  • Hero Member
  • *****
  • Beiträge: 501
    • Profil anzeigen
    • BASE 32
Re:Externe Clock Source für den dsPIC33F nutzen
« Antwort #3 am: Mai 24, 2011, 12:14:27 Nachmittag »
Hallo Corpsman,

ähm... ich glaube wir müssen uns zunächst noch ein paar Basics 'reinfahren:

  • Modifikation des Ausgangspegels eines Portpins bei allen PICs > 16F nienienie direkt über den PORT-Register. Der sollte nur gelesen werden. Beschrieben wird ein Ausgangspin immer über sein entsprechendes LAT-Registerbit! (Warum? Stichwort: "read-modify-write"-Problem). Zuvor sollte auch das entsprechende TRIS-Bit des Pins korrekt gesetzt werden (für Ausgang: TRIS = 0).
  • Du weißt, dass der dsPIC33F zwei Taktzyklen für die Abarbeitung eines Befehls benötigt? Dies bedeutet, wenn Du möchtest, dass der PIC mit 40 MIPS arbeitet, ist ein (interner) CPU-Takt von 80 MHz nötig! Hast Du das bei Deinen Überlegungen berücksichtigt?
    Was genau erzeugt bei Dir den Primärtakt? Ist das ein 40 MHz Schwingquarz? Nur mal so nebenbei: ich würde auf die Platine immer den langsamstmöglichen Quarz setzen und dann die interne PLL nutzen, um den Quarztakt auf die gewünschte Frequenz zu vervielfachen. Einerseits hast Du dann das hochfrequente Taktsignal nicht auf der Platine, außerdem ist es nicht immer ganz einfach, bei z.B. 40 MHz einen Grundtonquarz zu finden.
    Im Quelltext hast Du den HS-Oszillator ohne PLL eingestellt. Wenn dieser Quarz nun tatsächlich mit 40 MHz tickt, läuft Dein PIC intern also mit 20 MHz.
    Wenn Du den HS-Modus + PLL verwendest, solltest Du die vollen 40 MIPS problemlos generieren könnten. Der dsPIC33F verfügt über ein ziemlich geniales und flexibles PLL-System. Schau Dir dazu mal die Seite 141 im Datenblatt an. Du müsstest dazu natürlich die ganzen Vor-/Nachteiler und Multiplikatoren entsprechend einstellen.
  • Nun kommen wir zum Hauptproblem: ich verstehe nicht ganz, welche Frequenz hast Du denn bei der Messung am Portpin erwartet? Doch nicht etwa die tatsächliche Oszillatorfrequenz von 40 MHz!?
    Die Frequenz, die Du am Portpin misst ist ja nunmal abhängig von der Schleifendurchlaufzeit. Und da Du in C programmierst und nicht genau weißt, wie (effizient) der Compiler Deinen Code übersetzt, ist diese Durchlaufzeit für Dich schon mal nicht so einfach zu bestimmen. Du könntest das Assemblerlistig öffnen und nachzählen, aus wie vielen Instruktionen ein Schleifendurchlauf tatsächlich besteht. Ich tippe jetzt mal für den Optimalfall auf 5 (bei Deinem Beispiel ohne Berechnungen in der Schleife). Na das ist ja ein Zufall: 20 MHz interner Takt, geteilt durch 5 Instruktionen Schleifendurchlaufzeit macht 4 MHz am Portpin.  :o
    Das deckt sich doch ziemlich gut mit Deinen Messungen  ;)
    Je mehr Befehle Du in die Schleife hineinpackst, um so weiter geht die gemessene Portpinfrequenz natürlich in den Keller.

Für die Generierung einer definierten Frequenz an einem Portpin ist Dein Vorgehen etwas unglücklich. Idealerweise würde man einen PWM-Kanal mit 50 % Tastverhältnis und der gewünschten Periodendauer konfigurieren, oder das Toggeln des Portpins in einem Timer-Interrupt erledigen. In beiden Fällen kann man sich dann nämlich auf eine konstante und bekannte Zeitbasis verlassen. Dies wird bei Deiner Schleifenvariante hingegen bereits mit einer handvoll Befehlen in C ziemlich tricky.

Gruß
Daniel

Offline corpsman

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
    • Corpsman Delphi / Lazarus Page
Re:Externe Clock Source für den dsPIC33F nutzen
« Antwort #4 am: Mai 24, 2011, 13:03:32 Nachmittag »
Ich glaube wir nähern uns an ;)

Also ich nutze nun die PLL und "schwinge" außen mit 40 MHZ, Du hast natürlich Recht, dass 40 MHZ sehr viel ist, und auf Dauer will ich wahrscheinlich runter auf 8 MHZ. Das Schwingen auf der Schaltung ist mir dabei egal, der Stromverbrauch nicht.

Wie du Richtig angedeutet hast ist mein Ziel eine PWM. Ich will damit nämlich die Helligkeit meines LCD-Displays Steuern. Ich dachte nur zuerst sollte ich mal einen Definierten Tackt haben.

Was die TRIS Geschichte angeht, so verwechsle ich andauernd LAT und Port, habe das nun korrigiert, thx. Bzw. wenn ich schreibe "PORTDbits.RD0 = 1;" ist das dann OK oder muss ich wirklich die Variante mit "LATD = 2" nehmen ?

Mittlerweile habe ich mir nun eine N-Kanal schaltung zur Ansteuerung meines Backlights gebastelt. Setze ich den Pin RD0 = 1 so geht mein Backlight an, = 0 entsprechend aus.
Der Pin RD0 ist auch ein "OC1" Pin. Und mit dem will ich nun meine PWM realisieren. Dabei dachte ich an eine Frequenz von 0 bis ??(so dass mein Display eben schön dunkel wird) Kannst du mir dabei evtl. auch helfen ?.

[Edit]

Juhee, ich habe dieses PDF gefunden. Da steht exakt drin wie man eine PWM für die dsPIC33F Serie macht.
« Letzte Änderung: Mai 24, 2011, 14:22:13 Nachmittag von corpsman »
--
Just try it

Offline Coltfisch

  • Hero Member
  • *****
  • Beiträge: 501
    • Profil anzeigen
    • BASE 32
Re:Externe Clock Source für den dsPIC33F nutzen
« Antwort #5 am: Mai 24, 2011, 15:00:20 Nachmittag »
Zitat
Was die TRIS Geschichte angeht, so verwechsle ich andauernd LAT und Port, habe das nun korrigiert, thx. Bzw. wenn ich schreibe "PORTDbits.RD0 = 1;" ist das dann OK oder muss ich wirklich die Variante mit "LATD = 2" nehmen ?
Wie gesagt, bei Schreibzugriff auf den Port immer den LAT-Register verwenden: LATDbits.LATD0 = 1;

Zitat
Der Pin RD0 ist auch ein "OC1" Pin. Und mit dem will ich nun meine PWM realisieren. Dabei dachte ich an eine Frequenz von 0 bis ??(so dass mein Display eben schön dunkel wird) Kannst du mir dabei evtl. auch helfen ?.
PWM ist für diese Anwendung natürlich genau richtig. Aber so wie Du das vorhast, macht man das nicht; sondern es wird eine konstante PWM-Frequenz gewählt (für die LED-Hintergrundbeleuchtung könnte man z.B. 1kHz nehmen) und dimmt dann die LEDs über den Tastgrad, also das Verhältnis der Länge des HIGH-Pegels zur Länge des LOW-Pegels während einer Periode.
Grundsätzlich ist das Setup des PWM-Moduls nicht so schwierig, allerdings ist das Output Compare Modul des dsPIC33F mit Features total überfrachtet. Ohne ins Datenblatt des OC-Moduls zu schauen kommst Du hier nicht weiter.
Also, zunächst mal Section 13. Output Compare - dsPIC33F FRM herunterladen:
http://ww1.microchip.com/downloads/en/DeviceDoc/70209A.pdf
Auf S. 17 findest Du Beispielcode, um die nötigen Einstellungen des Moduls vorzunehmen.
Für Deine Anwendung würde ich den Code etwas abwandeln:

// Initialize Output Compare Module
OC1CONbits.OCM = 0b000; // Disable Output Compare Module
OC1R = 200; // Write the duty cycle for the first PWM pulse
OC1RS = 200; // Write the duty cycle for the second PWM pulse
OC1CONbits.OCTSEL = 0; // Select Timer 2 as output compare time base
OC1R = 200; // Load the Compare Register Value
OC1CONbits.OCM = 0b110; // Select the Output Compare mode
// Initialize and enable Timer2
T2CONbits.TON = 0; // Disable Timer
T2CONbits.TCS = 0; // Select internal instruction cycle clock
T2CONbits.TGATE = 0; // Disable Gated Timer mode
T2CONbits.TCKPS = 0b00; // Select 1:1 Prescaler
TMR2 = 0x00; // Clear timer register
PR2 = 1024; // Load the period value


Für Deinen Anwendungsfall solltest Du Dir zunächst überlegen, welche Auflösung Sinn macht. Also in wievielen Helligkeitsschritten Du die Beleuchtung variieren können möchtest. Ich rate Dir an dieser Stelle zu 10 Bit. (Wenn Du die PWM soweit laufen hast, verrate ich Dir warum und gebe Dir noch ein paar spezielle Spezialtips für ein lineares und gleichmäßiges Faden der Hintergrundbeleuchtung...  ;) )

Mit 10 Bit hast Du also 1024 Helligkeitsstufen. Am einfachsten ist es, wenn Du jetzt als Period Value des Timer2 PR2 = 1024 verwendest. Nun musst Du nur den Vorteiler des Timers (T2CONbits.TCKPS) so ausrechnen, dass Du auf eine PWM-Frequenz zwischen 200 und 2000 Hz kommst. Das ist eine kleine Hausaufgabe: schau welche Vorteiler beim Timer2 zur Verfügung stehen und versuche dann mit der Formel auf S. 15 eine passende Frequenz zu finden.

Sobald das PWM-Modul läuft kannst Du die Helligkeit des Backlights durch Beschreiben des OC1RS-Registers mit Werten zwischen 0 und 1023 einstellen.

Gruß & viel Erfolg


Offline corpsman

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
    • Corpsman Delphi / Lazarus Page
Re:Externe Clock Source für den dsPIC33F nutzen [gelöst]
« Antwort #6 am: Mai 25, 2011, 06:36:11 Vormittag »
*g*

ich schrieb zwar Frequenz, gemeint habe ich aber das Richtige. Die Links der beiden Datenblätter sind übrigens Identisch.

Als PWM Grundfrequenz habe ich nun einen Wert knapp über 1 KHz gewählt.

Die Sache mit dem prescaler ist mir nicht ganz klar ich habe das Problem nun so gelöst
#define LCD_PWM_TIME = 32500

// Initialize Output Compare Module
OC1CONbits.OCM = 0b000; // Disable Output Compare Module
OC1R = 100; // Write the duty cycle for the first PWM pulse
OC1RS = 0; // Write the duty cycle for the second PWM pulse
OC1CONbits.OCTSEL = 0; // Select Timer 2 as output compare time base
OC1R = 1000; // Load the Compare Register Value
OC1CONbits.OCM = 0b110; // Select the Output Compare mode
// Initialize and enable Timer2
T2CONbits.TON = 0;      // Disable Timer
T2CONbits.TCS = 0;      // Select internal instruction cycle clock
T2CONbits.TGATE = 0;   // Disable Gated Timer mode
T2CONbits.TCKPS = 0b00; // Select 1:1 Prescaler
TMR2 = 0x00; // Clear timer register
PR2 = LCD_PWM_TIME; // Load the period value
IPC1bits.T2IP = 0x01;  // Set Timer 2 Interrupt Priority Level
IFS0bits.T2IF = 0;      // Clear Timer 2 Interrupt Flag
IEC0bits.T2IE = 1;      // Enable Timer 2 interrupt
T2CONbits.TON = 1;      // Start Timer
im Interrupt schreibe ich dann
OC1RS = lcd_brightnes;
wobei ich lcd_brightness anhand meiner Frei wählbaren Skallierung wähle ( momentan 3 ). Auf dem Oszi sehe ich dann den von Dir beschriebenen Verlauf. Das Display läst sich wunderbar dimmen, ich bin Glücklich ;).

Für mich ist der Fall damit geklärt.

Einziger Unterschied zu deiner Erklärung ist meine LCD_PWM_TIME und das nicht verwenden des "Vorteilers". Hier fehlen mir anscheinend noch weitere Grundlagen, damit ich deren Sinn verstehe...
--
Just try it

Offline Coltfisch

  • Hero Member
  • *****
  • Beiträge: 501
    • Profil anzeigen
    • BASE 32
Re:Externe Clock Source für den dsPIC33F nutzen [gelöst]
« Antwort #7 am: Mai 25, 2011, 12:01:26 Nachmittag »
Hi,

Zitat
Die Links der beiden Datenblätter sind übrigens Identisch.
Ja da hatten wir wohl gerade parallel unsere Beiträge bearbeitet :)
Aber gut, dass Du selber auch schon auf das Dokument gestoßen bist, denn auch für die anderen Module des dsPIC wirst Du wohl hin und wieder mal in das Reference Manual schauen müssen  ;)

Zitat
Die Sache mit dem prescaler ist mir nicht ganz klar ich habe das Problem nun so gelöst
Das ist eigentlich ganz einfach. Prescaler 1:1 bedeutet grob gesagt, dass der Timer mit jedem Befehl, den die CPU verarbeitet, um eins erhöht wird. Bei einem Prescaler von 1:8 z.B. wird der Timer nur bei jedem 8. Befehl erhöht.


Zitat
Die Sache mit dem prescaler ist mir nicht ganz klar ich habe das Problem nun so gelöst...
Schön, dass es funktioniert!
Aber die Geschichte mit dem Interrupt hatte ich bewußt weggelassen, macht für Dich nämlich gar keinen Sinn. Du kannst die gewünschte Helligkeit direkt in den OC1RS-Register schreiben und brauchst das nicht separat in dem Interrupt tun.

Zitat
Das Display läst sich wunderbar dimmen, ich bin Glücklich  ;)
Auch das freut mich. Wenn Du genau hinschaust, hat Dein Dimmen aber einen Schönheitsfehler: Es dimmt (fürs Auge) nicht linear. Um dies zu erreichen, legt man sich einen logarithmischen Lookup-Table an (hier ein Beispiel für eine 10-Bit PWM):

const WORD pwmtable_10[64]  = {0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5,
                                    5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17,
                                    19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55,
                                    61, 68, 76, 85, 94, 105, 117, 131, 146, 162,
                                    181, 202, 225, 250, 279, 311, 346, 386, 430,
                                    479, 534, 595, 663, 739, 824, 918, 1023};

Damit reduzieren sich die Abstufungen zwar in diesem Fall auf nur noch 64, dies ist aber meist völlig ausreichend (benutze diese Methode selber zum Dimmen von LCD-Backlights).

Um die Helligkeit einzustellen wird dann der OC1RS-Register wie folgt beschrieben:
OC1RS = 1023-pwmtable_10[bright];

Um diese Variante zu verwenden müsstest Du aber - wie gesagt - Deine PWM auf 10 Bit einstellen. Ich denke, es sollte Funktionieren, wenn Du den Prescaler des Timer 2 auf 1:8 konfigurierst. Sollte dann geschätzte 600 Hz PWM-Frequenz ergeben.

Aber das nur als Info am Rande, wenn Du mit Deiner Version glücklich bist, ist das natürlich auch super  ;)

Gruß
Daniel


Offline corpsman

  • Newbie
  • *
  • Beiträge: 8
    • Profil anzeigen
    • Corpsman Delphi / Lazarus Page
Re:Externe Clock Source für den dsPIC33F nutzen [gelöst]
« Antwort #8 am: Mai 26, 2011, 06:27:59 Vormittag »
OK, Die Version ohne Interrupt gefällt mir auch besser, hab diese nun gewählt.

Und um die Diskussion wegen der PORT oder LAT Geschichte noch ein wenig an zu heizen ein Zitat aus diesem Datenblatt

Zitat
The differences between the PORT and LAT registers can be summarized as follows:
•  A write to the PORTx register writes the data value to the port latch.
•  A write to the LATx register writes the data value to the port latch.
•  A read of the PORTx register reads the data value on the I/O pin.
•  A read of the LATx register reads the data value held in the port latch.

Daraus verstehe ich :

Schreiben ist Egal ob PORT oder LAT, aber beim Lesen auf jeden Fall ein PORT nehmen.
--
Just try it

Offline Coltfisch

  • Hero Member
  • *****
  • Beiträge: 501
    • Profil anzeigen
    • BASE 32
Re:Externe Clock Source für den dsPIC33F nutzen [gelöst]
« Antwort #9 am: Mai 26, 2011, 08:38:20 Vormittag »
Zitat
Und um die Diskussion wegen der PORT oder LAT Geschichte noch ein wenig an zu heizen ein Zitat aus diesem Datenblatt
Ganz ehrlich, da gibt es nichts zu diskutieren ;) Es gibt einen klaren Grund für die Existenz der LAT-Register und deshalb sollte man sich auch angewöhnen, diese zu benutzen. Hierzu mehr:

Zitat
Schreiben ist Egal ob Port opder Lat, aber beim Lesen auf jeden Fall ein Lat nehmen.
Jein! Der LAT-Register ist ein sogenanntes "Shadow-Register", in dem der Wert gespeichert ist, den der entsprechende Ausgangs-Pin haben soll. Grob gesagt, wenn Du den Ausgangspegel eines Pins ändern möchtest, schreibst Du Deinen Änderungswunsch in dieses Register und die Hardware des PIC wird sich schnellstmöglich darum kümmern, dass der Pegel am Pin sich entsprechend ändert. Wie gesagt, dies gilt nur für Pins, die im Ausgangsmodus sind. Ist ein Pin im Eingangsmodus, kannst Du das LAT-Register natürlich ebenfalls beschreiben - und auch lesen. Aber der Wert, den Du dann liest, hat nichts mit dem momentan am Pin anliegenden Pegel zu tun!

Unser User Bernd hatte zum LAT-Register mal einen prima Beitrag hier im Forum verfasst, den ich nun nach langem Suchen endlich wiedergefunden habe:

Zitat
wenn Du  Portpins als Eingang benutzt, mußt Du die PORTx-Register zum Auslesen des Zustands an dem Portpin verwenden. Die LATx-Register sind nur für die Ausgabe von Werten an die Portpins geeignet. Ihr großer Vorteil ist die Vermeidung des "read-modify-write" Problems bei Portpins.

Code:

;Angenommen PORTB = 0, TRISB = 0
  bsf PORTB, 0   ; RB0 auf 1
  bsf PORTB, 1   ; RB1 auf 1

Nach der Abarbeitung des obigen Codes ist das Ergebnis etweder RB0 = 1 und RB1 = 1 (korrekt) oder aber RB0=0 und RB1=1. Welches der beiden Ergebnisse zutreffend ist, hängt von äußeren Faktoren ab (Taktfrequenz des PICs, (kapazitive) Belastung der Ausgänge).

Der eventuell falsche Wert von RB0 entsteht dabei folgendermaßen:

Bei dem bsf-Befehl wird grundsätzlich das komplette Register PORTx eingelesen (also die momentan an den Pins anstehenden Werte), ein Bit des eingelesenen Wertes modifiziert und dieser modifizierte Wert zurückgeschrieben. Wenn der Ausgangspin stark belastet ist, kann es passieren, daß beim zweiten bsf-Befehl an dem Pin RB0 noch eine "0" erkannt wird, und dieser falsche Wert dann zurückgeschrieben wird.

Dies ist bei der Verwendung der LAT-Register ausgeschlossen, da zwar auch hier eine read-modify-write Operation stattfindet, aber der an PORTx anliegende Pegel keine Rolle spielt. Es wird der Sollzustand des Ausgangs-Latch-Register gelesen, nicht der aktuelle Zustand am Portpin.


Fazit:
- Eingangspins immer über das PORT-Register lesen
- Ausgangspins immer über das LAT-Register beschreiben
 ;)

 


* Recent Topics