Forum: Mikrocontroller und Digitale Elektronik Atmel Studio kennt viele Befehle aus der io.h NICHT warum?


von Felix N. (felix_n888)


Lesenswert?

Hallo Community.
Ich programmiere mir zurzeit eine Komplexe Kreuzungsampel mit 
Fußgängerübergang. Aber mein Problem ist das ich mit der _delay_ms(ms); 
Funktion arbeitet da die Ampel automatische Schaltet. Zudem nutze ich 
auch noch Interrupts, da ich mit ein Mirkotaster Arbeite. Wie man das ja 
bei vielen Ampel kennt darf ja auch, die "Signal Kommt" oder "Bitte 
Warten" Lampe nicht fehlen. Diese habe ich auch eingebaut und, diese 
soll natürlich auch Blinken. Um mir aber ein Paar Werte auszugeben. Da 
bei mir der Timer 8 Bit bisschen "komisch" ist. Was die Antwortzeit an 
geht. Nun ja um mir die Werte auszugeben nutzte ich denn Seriellen 
Monitor von der Arduino IDE. Im Internet habe ich ein kleines Tutorial, 
für eine einfache Serial Kommunikation gefunden(RX, TX). Dieses wollte 
ich nun wenden um mir am Ende ein paar Daten auszugeben. Nur wenn ich 
zum Beispiel _BV() oder loop_until_bit_is_set() nutzen will die ja 
normalerweise(So steht es zu mindestes im Internet) in der avr/io.h sich 
befinden sollen, findet der diese Methode nicht.
Woran kann diese liegen?
Hier ist der Link zum Tutorial das ich nutzte: 
http://www.appelsiini.net/2011/simple-usart-with-avr-libc

Hier ein Bild von mein aktuellen Code: http://prntscr.com/a1ji6e
Wenn ich zum Beispiel über "loop_until_bits..." gehe kommt da: "Add 
Include "sfr_defs.h" sind das nun alles ein extra Header Dateien?
Aso hier nochmal ein Bild, von der Output Log: http://prntscr.com/a1jkdt

Mfg Jan

: Bearbeitet durch User
von g457 (Gast)


Lesenswert?

> Aso hier nochmal ein Bild, von der Output Log: http://prntscr.com/a1jkdt

Einfach mal die erste Fehlermeldung lesen und die Ursache beheben. Achja 
und Bilder kann man auch hier anhängen.

von Falk B. (falk)


Lesenswert?

@ Felix Neumann (felix_n888)

>Ich programmiere mir zurzeit eine Komplexe Kreuzungsampel mit
>Fußgängerübergang. Aber mein Problem ist das ich mit der _delay_ms(ms);
>Funktion arbeitet da die Ampel automatische Schaltet.

Naja, nicht die schönste Lösung, geht aber. Besser ist es aber so, siehe 
Statemachine.

>soll natürlich auch Blinken. Um mir aber ein Paar Werte auszugeben. Da
>bei mir der Timer 8 Bit bisschen "komisch" ist.

Was ist da komisch?

>ich nun wenden um mir am Ende ein paar Daten auszugeben. Nur wenn ich
>zum Beispiel _BV() oder loop_until_bit_is_set() nutzen will

Das ist alter Kram, heute kann man die Bits direkt abfragen, einfach 
hinschreiben, siehe Bitmanipulation.

> die ja
>normalerweise(So steht es zu mindestes im Internet) in der avr/io.h sich
>befinden sollen, findet der diese Methode nicht.

Methoden gibt es dort so oder so nicht, denn der avr gcc ist reines C. 
Methoden gibt es nur in C++. jaja, Arduino hat einen Schuß C++, aber der 
ist fast hömiopatisch ;-)

>Woran kann diese liegen?
>Hier ist der Link zum Tutorial das ich nutzte:
>http://www.appelsiini.net/2011/simple-usart-with-avr-libc

Wenn du doch schon mit der Arduino-IDE arbeitest, kannst du auch gleich 
die Arduino-Libs für den UART nutzen.

>Hier ein Bild von mein aktuellen Code: http://prntscr.com/a1ji6e
>Wenn ich zum Beispiel über "loop_until_bits..." gehe kommt da: "Add
>Include "sfr_defs.h" sind das nun alles ein extra Header Dateien?

???

>Aso hier nochmal ein Bild, von der Output Log: http://prntscr.com/a1jkdt

Mfg Jan

von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

Danke erst mal für euere Antworten.

Ich habe mir mal ein Video dazu angeschaut. Also zu  Serial 
Kommunikation. Es Funktioniert auch. Nur ich gebe ja in mein Code die 
Zahl "8" aus. Und habe dann ein Kabel von meinen Arduino UNO Board zum 
Breadboard angeschlossen(Also RESET, RX, TX, +5, 0 V). Damit ich das 
Programm übertragen kann wenn ich aber versuche über denn Serial Monitor 
versuche dieses Signal wieder "auf zunehmen" kommt dort nur das a mit 
dem schrägen Strich drauf. Wenn ich es über Tera Term versuche "auf 
zunehmen" dann kommt dort nur ein dieses Zeichen ' .

Woran liegt das? Am UNO Board selber?

von Falk B. (falk)


Lesenswert?

Falsche Baudrate.
Erfinde das Rad nicht neu, nutze die Arduino-Funktionen!

1
void setup()
2
{
3
  Serial.begin(9600);
4
}
5
6
void loop()
7
{
8
    Serial.println("Hello World!");
9
}

von Felix N. (felix_n888)


Lesenswert?

Hallo Falk Brunner!

Ich hätte dazu 2 Fragen:

- Wo liegt denn die Datei die ich Includieren muss um auf "Serial." 
zugreifen zu können? Sonst kommt 'Serial' was not declared in this scope

- Wieso ist denn die Baudrate falsch beim Arduino ist sie doch auch 
9600?

von Falk B. (falk)


Lesenswert?

@ Felix Neumann (felix_n888)

>- Wo liegt denn die Datei die ich Includieren muss um auf "Serial."
>zugreifen zu können? Sonst kommt 'Serial' was not declared in this scope

Das ist ein Beispiel für Arduino, die kann man direkt in der Arduino IDE 
so compilieren. Wenn man ein Arduino-Board im Atmelstudio nutzt, muss 
man vielleicht noch ein Include #include <arduino.h> hinzufügen, da kenn 
ich mich aber nicht aus.

>- Wieso ist denn die Baudrate falsch beim Arduino ist sie doch auch
>9600?

Keine Ahnung.

Hast du einen bayrischen Arduino?

#define BUAD 9600

;-)

: Bearbeitet durch User
von Felix N. (felix_n888)


Lesenswert?

Falk B. schrieb:
> Keine Ahnung.
>
> Hast du einen bayrischen Arduino?
>
> #define BUAD 9600

Keine Ahnung. Ich habe diesen 
http://danielscheidler.de/wp-content/uploads/2013/02/ArduinoUno_R3_Front.jpg 
"Made in Italy" steht dort auch.

#define BUAD 9600 stand doch auch schon in meinen Code. Oder habe ich da 
nun irgendwas falsch verstanden?

Es gibt ja auch solche USB Kabels mit VCC, GND, TX, RX, CTS und RTS. 
Aber eigentlich muss sowas doch auch dirket übers Board gehen. Ich werde 
parallel noch ein Thread im Arduino Forum machen und dort mal nach 
fragen

von Grrr.... (Gast)


Lesenswert?

Felix N. schrieb:
> Ich werde
> parallel noch ein Thread im Arduino Forum machen und dort mal nach
> fragen

Das ist eine gute Idee!
Je weniger Ahnung, desto mehr Foren beschäftigen....

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix N. schrieb:
> ein Mirkotaster
Ist das sowas wie ein "Felixschalter"?

Felix N. schrieb:
> #define BUAD 9600 stand doch auch schon in meinen Code.
Der Mann hieß "BAUD"...

Du solltest dir merken: Menschen reagieren gelockert auf Schreibfehler. 
Compiler bissig!

g457 schrieb:
> Achja und Bilder kann man auch hier anhängen.
Und Fehlermeldungen und Quelltexte kann man als "ASCII-Code" direkt in 
die Editbox einfügen...

von Peter D. (peda)


Lesenswert?

Felix N. schrieb:
> Hier ein Bild von mein aktuellen Code: http://prntscr.com/a1ji6e

Code nie, unter keinen Umständen, absolut gar nicht und auf keinen 
Fall als Bild posten!
Wie soll man solchen Code zitieren, Syntax prüfen oder compilieren?

Code immer als plain Quelltext posten (*.c, *.ino).
Und am besten als Anhang, dann kann man nämlich die Fehlermeldungen 
(Zeilennummer) zuordnen.

von Felix N. (felix_n888)


Lesenswert?

Lothar M. schrieb:
>> #define BUAD 9600 stand doch auch schon in meinen Code.
> Der Mann hieß "BAUD"...
>
> Du solltest dir merken: Menschen reagieren gelockert auf Schreibfehler.
> Compiler bissig!

Ich habe es nun zu BAUD angepasst. Aber es ändert sich nix. Immer noch 
kommen die gleichen Zeichen in der Console an. Kann es sein(Ich weis ja 
nicht ob sich damit jemand auskennt), das das Arduino UNO Board oder 
allgemein die Arduino Board nicht dazu in der Lage sind über denn 
TX/RX(digital pin 1 und 0) Signal zu empfangen und dann weiter zuleiten?


Mfg Felix

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix N. schrieb:
> Kann es sein(Ich weis ja nicht ob sich damit jemand auskennt)
Du bist zum Glück nicht der Erste, der sowas machen will.
Da gibt es zwei Möglichkeiten:
1. Was sagt das Handbuch?
https://www.arduino.cc/en/Reference/Serial
2. Wie haben es denn Andere gemacht?
https://www.google.de/search?q=arduino+uno+rx+tx

Fazit 1: doch, es geht.
Fazit 2: Fehlersuche besteht zuallererst aus der Fehleranalyse...

> Immer noch kommen die gleichen Zeichen in der Console an.
Lass dir die Zeichen mal als Hex-Zahl anzeigen. Kommt immer das selbe 
Zeichen an, egal was du sendest? Was passiert, wenn du am Terminal die 
Baudrate umschaltest? Hast du ein Oszilloskop zur Hand? Kommen gleich 
viele falsche Zeichen an, wie gesendet werden? Oder sind es mehr bzw. 
weniger?

: Bearbeitet durch Moderator
von Peter D. (peda)


Lesenswert?

Mit ner 1s Blink-LED überprüfen, ob F_CPU überhaupt stimmt.

von Felix N. (felix_n888)


Lesenswert?

Lothar M. schrieb:
>> Immer noch kommen die gleichen Zeichen in der Console an.
> Lass dir die Zeichen mal als Hex-Zahl anzeigen. Kommt immer das selbe
> Zeichen an, egal was du sendest? Was passiert, wenn du am Terminal die
> Baudrate umschaltest? Hast du ein Oszilloskop zur Hand? Kommen gleich
> viele falsche Zeichen an, wie gesendet werden? Oder sind es mehr bzw.
> weniger?

Hex Zahl anzeigen Öh wie geht denn das?
Es kommen immer die gleichen Zahlen an wenn ich aber das Zeichen von 
einer 8 zu einen A welche kommt dort wieder ein anderes Zeichen an und 
so weiter...

Wenn ich die Baudrate umschalte z.B auf 57600 dann kommen diese Zeichen: 
³³³³³. Wenn ich es noch höher stelle dann kommt nix mehr. Also keine 
Zeichen mehr an. Habe kein Oszilloskop zu teuer. Nein es kommen immer 
nur im Sekunden Takt Daten an und immer von der gleichen menge her.

Peter D. schrieb:
> Mit ner 1s Blink-LED überprüfen, ob F_CPU überhaupt stimmt.
Habe es getestet F_CPU ist richtig 16 MHZ

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix N. schrieb:
> Habe es getestet F_CPU ist richtig 16 MHZ
Und der Controller verwendet auch diese Taktquelle mit 16MHz?
Und somit blinkt diese Test-LED 1x pro Sekunde?

von Felix N. (felix_n888)


Lesenswert?

So

Lothar M. schrieb:
> Felix N. schrieb:
>> Habe es getestet F_CPU ist richtig 16 MHZ
> Und der Controller verwendet auch diese Taktquelle mit 16MHz?
> Und somit blinkt diese Test-LED 1x pro Sekunde?

So habe ich dieses getestet:
1
#define F_CPU 16000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
#define LED 5
7
8
int main(void){
9
  
10
  DDRB = (1<<LED);
11
  
12
    while (1) {
13
    PORTB |= (1<<LED);
14
    _delay_ms(500);
15
    PORTB &= ~(1<<LED);
16
    _delay_ms(500);          
17
    }
18
}

von Felix N. (felix_n888)


Lesenswert?

keine ne Idee?

Wenn ich mir ein USB to TTL Adapter kaufen würde, würde dann das Problem 
behoben sein?

Mfg Felix

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix N. schrieb:
> Wenn ich mir ein USB to TTL Adapter kaufen würde, würde dann das Problem
> behoben sein?
Das "Problem" muss für eine zutreffende Aussage erst mal untersucht 
werden. Spar dir das Geld für einen Adapter und kauf dafür irgendein ein 
noch so lausiges Oszilloskop. Dann kannst du Messen und musst nicht 
Raten...

Brück mal an deiner seriellen Schnitte die RX und TX Leitung und Tipp 
was ins Terminal ein. Du müsstest dann "deine" Zeichen wieder 
zurückbekommen. Funktioniert wenigstens das?

von Felix N. (felix_n888)


Lesenswert?

Lothar M. schrieb:
>> Wenn ich mir ein USB to TTL Adapter kaufen würde, würde dann das Problem
>> behoben sein?
> Das "Problem" muss für eine zutreffende Aussage erst mal untersucht
> werden. Spar dir das Geld für einen Adapter und kauf dafür irgendein ein
> noch so lausiges Oszilloskop. Dann kannst du Messen und musst nicht
> Raten...
>
> Brück mal an deiner seriellen Schnitte die RX und TX Leitung und Tipp
> was ins Terminal ein. Du müsstest dann "deine" Zeichen wieder
> zurückbekommen. Funktioniert wenigstens das?

Hallo Lothar!

Ich habe es mir ja auch nicht gekauft wahr nur eine frage. Also wenn ich 
in Tera Term was eingebe z.B 1 oder 0 dann kann ich am Arduino Board 
sehen das was über RX gesendet wird aber in der Console kommt es selber, 
nicht an. Es ist überbrückt. Ich habe vorhin mal ein Skript mit der 
Arduino IDE Programmiert mit Serial.begin(9600); und Serial.print("0") 
Das kommt auch richtig an. Also es erscheint wieder die Zhal "0" wenn 
ich aber mit UDR0 = '0' sende kommt dort nur ein "." an.

Ich denke mal das das Problem im Code liegt. Ich würde mir ja gerne die 
cpp Datei anschauen wo die print Methode drin ist. Aber ich denke mal 
das diese in der IDE "rein" programmiert sind und nicht als externe 
Datei vorliegen. Oder?

von Falk B. (falk)


Lesenswert?

@ Felix Neumann (felix_n888)

>Wenn ich mir ein USB to TTL Adapter kaufen würde, würde dann das Problem
>behoben sein?

Für einen Arduino? Der hat das doch schon auf dem Board?

"Und habe dann ein Kabel von meinen Arduino UNO Board zum
Breadboard angeschlossen(Also RESET, RX, TX, +5, 0 V). "

https://www.arduino.cc/en/Main/ArduinoBoardUno

Warum machst du das alles so verdammt umständlich? Schließ das normale 
USB-Kabel an den Arduino an, programmier mit der Arduino-IDE, nicht 
Atmelstudio und sei erstmal glücklich. Da braucht man keinerlei 
Steckbrett, um den UART zu nutzen! Damit kann man SEHR viel machen und 
lernen, ehe man die zusätzlichen Möglichkeiten des "echten" Zugriffs auf 
alle AVR-Komponenten jenseits der Arduino-Funktionen braucht.

>in Tera Term was eingebe z.B 1 oder 0 dann kann ich am Arduino Board
>sehen das was über RX gesendet wird aber in der Console kommt es selber,
>nicht an. Es ist überbrückt.

Was ist EXAKT WO gebrückt?

> Ich habe vorhin mal ein Skript mit der
>Arduino IDE Programmiert mit Serial.begin(9600); und Serial.print("0")
>Das kommt auch richtig an.

Dann nutze das weiter!

>Ich denke mal das das Problem im Code liegt.

Ja.

>Ich würde mir ja gerne die
>cpp Datei anschauen wo die print Methode drin ist.

Wozu? Das ist weder nötig noch auf deinen Anfängerniveau sinnvoll 
möglich.

> Aber ich denke mal
>das diese in der IDE "rein" programmiert sind und nicht als externe
>Datei vorliegen. Oder?

Nein, beim Arduino liegen alle Klassen als offener Quellcode vor.

von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

Jaaaa,
Es funktioniert nun.
Ich habe mir vom Author des ersten Tutorial(das ich auch verlinkt habe) 
mir auf Github das nochmal genau angeschaut. Und nochmal 
nachprogrammiert. Nun funktioniert es Problemlos.

https://github.com/tuupola/avr_demo/tree/master/blog/simple_usart

von Falk B. (falk)


Lesenswert?

Nachprogrammiert? Nennt man das heute so beim kopieren und drei Zeichen 
ändern?

von Marco H. (damarco)


Lesenswert?

Kauf dir nen Buch ! z.Bsp Mikrocomputertechnik mit Controllern der Atmel 
AVR-Risc-Familie von Günter Schmitt.

Das ist sehr gut erklärt, mit reinen kopieren lernst du nichts da du 
ewt. den Mist von anderen auch noch abschreibst und sowie so nicht 
verstehst was da passiert.

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.