AVR Arduino Nano PD0 & PD1

Antworten
Mathias
Beiträge: 5088
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

AVR Arduino Nano PD0 & PD1

Beitrag von Mathias »

Dieser Mini-Code funktioniert wie erwartet, alle Pins von PORTD blinken. Dieser Code habe ich mit der Arduino-IDE hochgeladen.

Code: Alles auswählen

void setup() {
  DDRD = 255;
}
 
void loop() {
  PORTD = 255;
  delay(1000);         
  PORTD = 0;
  delay(1000);         
}


Setzt ich diesen Code in Pascal um, blinken die Pin PD0 & PD1 nicht.
PD2 bis PD7 blinken. Ich weis, PD0 und PD1 werden auch für TX & RX des UART gebraucht.

Code: Alles auswählen

begin
  DDRD := 255;
  repeat
    PORTD := 255;
    mysleep(sl);
 
    PORTD := 0;
    mysleep(sl);
  until 1 = 2;
end.

Was macht Arduino anders, da es dort funktioniert ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: AVR Arduino Nano PD0 & PD1

Beitrag von mse »

Vorschlag: Schau dir im Datenblatt die Reset-Zustände der massgebenden Register der Portsteuerung an. Vielleicht macht die Arduino Firmware Initialisierungen die man nicht sieht.

Edit:
Hier:
http://ww1.microchip.com/downloads/en/D ... 01984A.pdf
http://ww1.microchip.com/downloads/en/D ... _d114e7448
http://ww1.microchip.com/downloads/en/D ... d114e19290
http://ww1.microchip.com/downloads/en/D ... d114e41465
Bit 4 – RXEN0
Receiver Enable 0
Writing this bit to one enables the USART Receiver. The receiver will override normal port operation for
the RxDn pin when enabled. Disabling the receiver will flush the receive buffer invalidating the FE0,
DOR0, and UPE0 flags.
Bit 3 – TXEN0
Transmitter Enable 0
Writing this bit to one enables the USART transmitter. The transmitter will override normal port operation
for the TxD0 pin when enabled. The disabling of the transmitter (writing TXEN0 to zero) will not become
effective until ongoing and pending transmissions are completed, i.e., when the transmit shift register and
transmit buffer register do not contain data to be transmitted. When disabled, the transmitter will no longer
override the TxD0 port.

Der Resetzustand von RXEN0 und TXEN0 ist 0 -> das dürfte nicht das Problem sein. Kontrolliere doch die beteiligten Register mit dem Debugger zur Laufzeit.

Mathias
Beiträge: 5088
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR Arduino Nano PD0 & PD1

Beitrag von Mathias »

Der Resetzustand von RXEN0 und TXEN0 ist 0 -> das dürfte nicht das Problem sein.
Genau, dies war das Problem.
Danke.

Anscheinend lässt Avrdude dies beiden Register nach der Übertragung auf HIGH.
Mit folgendem Code, ist das Problem weg. 8)

Code: Alles auswählen

begin
  DDRD := 255;
  UCSR0B := 0;
  repeat

Ganz am Schluss von Init(), in der Datei wiring.c habe ich folgendes gefunden:

Code: Alles auswählen

   // the bootloader connects pins 0 and 1 to the USART; disconnect them
   // here so they can be used as normal digital i/o; they will be
   // reconnected in Serial.begin()
#if defined(UCSRB)
   UCSRB = 0;
#elif defined(UCSR0B)
   UCSR0B = 0;
#endif


PS: Dies werde ich im AVR-Tutorial aufnehmen. :wink:
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: AVR Arduino Nano PD0 & PD1

Beitrag von mse »

Nach dem Schreiben des Programmes sollte unbedingt ein Reset ausgeführt werden. Es gibt noch viele weitere Register welche irgendwie gesetzt sein können...

Mathias
Beiträge: 5088
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR Arduino Nano PD0 & PD1

Beitrag von Mathias »

Nach dem Schreiben des Programmes sollte unbedingt ein Reset ausgeführt werden.

Meinst du mit einer Init() procedure, welche alles zurücksetzt ?

Was ich noch festgestellt habe UCSR0B, muss im Bootloader gesetzt werden, weil das entfernen der Stromversorgung des Nanos bring nichts.
Averdude ist somit unschuldig.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: AVR Arduino Nano PD0 & PD1

Beitrag von mse »

Mathias hat geschrieben:
Nach dem Schreiben des Programmes sollte unbedingt ein Reset ausgeführt werden.

Meinst du mit einer Init() procedure, welche alles zurücksetzt ?

Nein, ein Hardware reset, was aber nicht hilft, wenn der Bootloader nach dem Reset immer anläuft. In diesem Fall must du dich informieren, was der Bootloader sonst noch alles umstellt und wie du schreibst in einer Init() Prozedur rückstellen.
Kann man nicht auch die ICSP Schnittstelle zum Programmieren und Debuggen verwenden?

Mathias
Beiträge: 5088
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: AVR Arduino Nano PD0 & PD1

Beitrag von Mathias »

In diesem Fall must du dich informieren, was der Bootloader sonst noch alles umstellt

Am besten die Arduino-Source angucken.
In der schnelle habe ich dort gesehen, das an den Timern rum geschraubt wird und AD der AD-Wandler wird eingeschalten. Da sieht man, wieso man unter Arduino den Timer0 nicht nutzen kann.
Das einzig wichtige scheint UCSR0B zu sein, alles andere muss man sowieso konfigurieren, wen man es braucht ( Timer, AD-Wandler ).

Ich habe das Tutorial wegen UCSR0B angepasst.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten