Forum: Mikrocontroller und Digitale Elektronik Arduino Pro Mini TXD als normalen I/O verwenden


von FloProMini (Gast)


Lesenswert?

Hallo,

Ich möchte den Pin PD1 bzw- TXD als normalen I/O Pin verwenden.
Folgender Test-Code wurde geschrieben (in Eclipse, C):
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4
5
int main(){
6
7
  DDRD  = 1<<1; // PD1 as output
8
  sei();        // enable global interrupts
9
10
  while(1) {
11
    _delay_ms(500);
12
    PORTD ^= 1<<1; // toggle pin
13
  }
14
}

Obiger Code funktioniert nicht. Am Pin tut sich garnichts. Mit einem 
Arduino Uno und Nano funktioniert es, komischerweise.

Als nächstes habe ich in der ArduinoIDE den selben Code compiliert und 
wieder ohne Erfolg.

Dann hab ich folgendes in der ArduinoIDE probiert:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <avr/interrupt.h>
4
5
void setup() {
6
  DDRD  = 1<<1;
7
  sei();
8
}
9
10
void loop(){
11
  _delay_ms(500);
12
  PORTD ^= 1<<1;
13
}

Mit der setup- und loop Routine funktioniert es nun.

Hat jemand eine Idee warum dies so ist und wie ich es in normalen C 
handeln kann? Möchte ungern die ArduinoIDE verwenden...

Mfg,
Florian

von Hi.Lo. (Gast)


Lesenswert?

FloProMini schrieb:
> Obiger Code funktioniert nicht. Am Pin tut sich garnichts. Mit einem
> Arduino Uno und Nano funktioniert es, komischerweise.

Wenn Du sagst, dass das mit einem Arduino Uno und einem Arduino Nano 
funktioniert, dann sag doch bitte auch kurz dazu, auf welcher Plattform 
es nicht funktioniert... Ein blanker ATMega328p?

von Hi.Lo. (Gast)


Lesenswert?

PS: Wenn du die delay.h verwendest, musst du dem Compiler die Taktrate 
mitteilen. Entweder in den Compilerflags, oder per

#define F_CPU xxx

von FloProMini (Gast)


Lesenswert?

Hi.Lo. schrieb:
> Wenn Du sagst, dass das mit einem Arduino Uno und einem Arduino Nano
> funktioniert, dann sag doch bitte auch kurz dazu, auf welcher Plattform
> es nicht funktioniert... Ein blanker ATMega328p?

ATMega328P mit Bootloader und was so dazugehört, kann ihn genauso 
programmieren wie den Uno/Nano, nur dieser eine Pin wirft Fragen auf.

Hi.Lo. schrieb:
> PS: Wenn du die delay.h verwendest, musst du dem Compiler die Taktrate
> mitteilen. Entweder in den Compilerflags, oder per

Natürlich. Ist nur ein Testprogramm gewesen um mein Problem zu 
erläutern..

Es wurde ein Arduino Pro Mini in dieser Variante verwendet: 5V 16Mhz

von Jens M. (schuchkleisser)


Lesenswert?

Der Pro Mini, der Nano und der Uno verwenden alle den ATmega328p.
Deine Hardware ist also defekt, denn das sind alle drei identische 
Schaltungen die sich primär mechanisch unterscheiden.

von FloProMini (Gast)


Lesenswert?

Jens M. schrieb:
> Deine Hardware ist also defekt

Wie kann das sein? Ein Programm, dass ich in
1
void setup()
 und
1
void loop()
 aufteile, funktioniert doch.

Bin sehr verwirrt.

von Jens M. (schuchkleisser)


Lesenswert?

Dann ist an deinem Test was falsch.
Die drei Platinen haben identische Schaltpläne bis auf
- Spannungsversorgung (aber 5V sind 5V)
- Quarz (16MHz, die Bauform ist aber egal)
- externe Pins (aber auch nur mechanisch)
- USB/Seriell-Adapter (einmal als FTDI, einmal als ATtiny, einmal 
extern, aber RxD und TxD ist immer das gleiche)

von W. H. (Gast)


Lesenswert?

ich denke, dass hier unterschiedliche Bootloader ein unterschiedliches 
Verhalten ergeben.

von FloProMini (Gast)


Lesenswert?

W. H. schrieb:
> ich denke, dass hier unterschiedliche Bootloader ein unterschiedliches
> Verhalten ergeben.

Vielen Dank für den Tipp! Hab den selben Bootloader der auf den Uno/Nano 
ist geflasht und es funktioniert!

Danke!

Mfg,
Florian

von Stefan F. (Gast)


Lesenswert?

FloProMini schrieb:
> Bin sehr verwirrt.

Das ist so bei Arduino. Setup() wird einmal am Anfang aufgrufen, und 
loop() wird danach endlos oft wiederholt.

von Andre (Gast)


Lesenswert?

W. H. schrieb:
> ich denke, dass hier unterschiedliche Bootloader ein unterschiedliches
> Verhalten ergeben.

Wie geht das denn?
Ernste Frage, meiner Meinung nach ist der nach dem Reset inaktiv?

von Mario M. (thelonging)


Lesenswert?

Dann lässt der alte Bootloader vermutlich RXEN/TXEN gesetzt und nur die 
Arduino-Variante des Programms setzt sie wieder zurück.

von FloProMini (Gast)


Lesenswert?

Stefanus F. schrieb:
> Das ist so bei Arduino. Setup() wird einmal am Anfang aufgrufen, und
> loop() wird danach endlos oft wiederholt.

Das ist mir mehr als klar.
Selbes prinzip bei
1
int main(void){
2
  // setup
3
  while(1){
4
  // loop
5
  }
6
}

von Hi.Lo. (Gast)


Lesenswert?

Welchen Compiler nutzt Du denn?

Probiere doch mal, anstatt der _delay_ms(500), _delay_ms(50) zu 
verwenden.

Siehe dazu auch:
https://www.nongnu.org/avr-libc/user-manual/group__util__delay.html#gad22e7a36b80e2f917324dc43a425e9d3

Es könnte sein, dass 500 zu viel ist und die Funktion daher mit 0ms 
arbeitet.

von FloProMini (Gast)


Lesenswert?

Hi.Lo. schrieb:
> Welchen Compiler nutzt Du denn?

avr-gcc


Danke für den Tipp, das Problem wurde schon gelöst:

FloProMini schrieb:
> W. H. schrieb:
>> ich denke, dass hier unterschiedliche Bootloader ein unterschiedliches
>> Verhalten ergeben.
>
> Vielen Dank für den Tipp! Hab den selben Bootloader der auf den Uno/Nano
> ist geflasht und es funktioniert!

Kann man den Thread irgendwie als "gelöst" markieren?

von Manfred (Gast)


Lesenswert?

FloProMini schrieb:
> das Problem wurde schon gelöst

Das ist nich nachvollziehbar: Laut meiner Boards.txt der Arduino-IDE 
haben Nano und ProMini den gleichen Bootloader 
"atmega/ATmegaBOOT_168_atmega328.hex"

Der Uno hat einen anderen Bootloader.

Oder kann es sein, dass Du einen neuen Nano hattest, der mit Optiboot 
ausgerüstet war? Indirekt kann man das an der Baudrate beim Upload 
sehen, 57600 oder 115200.

von FloProMini (Gast)


Lesenswert?

Manfred schrieb:
> Oder kann es sein, dass Du einen neuen Nano hattest, der mit Optiboot
> ausgerüstet war?

Sorry mein Fehler. Der Nano hat einen anderen Bootloader. Das Problem 
hab ich gelöst indem ich denselben Bootloader, der auf dem Uno ist, auf 
den ProMini geflasht habe. Hab mich da etwas vertan mit meinen Posts.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

FloProMini schrieb:
> Sorry mein Fehler. Der Nano hat einen anderen Bootloader. Das Problem
> hab ich gelöst indem ich denselben Bootloader, der auf dem Uno ist, auf
> den ProMini geflasht habe. Hab mich da etwas vertan mit meinen Posts.

 Ein einfaches
1
 UCSR0B = 0;
 am Anfang hätte es auch getan...

von kunz (Gast)


Lesenswert?

> Ein einfaches UCSR0B = 0;
> am Anfang hätte es auch getan...

Das fehlt wohl in den utubevideos.

Handbuchleser wissen mehr!

von FloProMini (Gast)


Lesenswert?

kunz schrieb:
> Das fehlt wohl in den utubevideos.
>
> Handbuchleser wissen mehr!

seh ich auch so ;-)

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.