www.mikrocontroller.net

Forum: Compiler & IDEs Unnötige Warteprozedur?


Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem "Lehrheft LCD Programmierung" von myavr wird für fast jedes 
Beispiel die folgende Warteprozedur als benötigt angegeben:
#define F_CPU 3686400
#include <util/delay.h>
#include <avr/io.h>
//...
void wait_ms(int miliSec)
{
_delay_loop2(1*(F_CPU/(1000/4))*miliSec); //4 Zyklen Warteschleife
}
wäre folgendes nicht viel einfacher:
#define F_CPU 3686400
#include <util/delay.h>
#include <avr/io.h>
//...
//und dann an jeder betreffenden Stelle
//statt wait_ms(miliSec) 
_delay_ms(miliSec)
Ich verstehe nicht ganz den Sinn der oberen Anweisung.
Zuersteinmal könnte man die Zeile doch auf
 
_delay_loop2((F_CPU/250)*miliSec);//4 Zyklen Warteschleife
kürzen und warum noch eine Wartefunktion für Milisekunden 
implementieren?
Könnt ihr mir da helfen??
Der einzige Grund, warum ich mich noch einmal mit diesem wirren Quatsch 
beschäftige, ist, dass ich die Ausrüstung von myAVR noch da habe und 
jetzt mal als Testboard verwenden will.
Mit freundlichen Grüßen,
Valentin Buck

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Valentin Buck schrieb:

> wäre folgendes nicht viel einfacher:
>
> #define F_CPU 3686400
> #include <util/delay.h>
> #include <avr/io.h>
> //...
> //und dann an jeder betreffenden Stelle
> //statt wait_ms(miliSec)
> _delay_ms(miliSec)
> 

Im Prinzip ja ... wenn es da nicht zwei Einschärnkung bei _delay_ms 
gäbe:
Zum einen muss der Optimizer zwingend eingeschaltet werden, ansonsten 
stimmen die Zeiten nicht.
Zum anderen darf als Argument an _delay_ms nur eine Konstante übergeben 
werden. Ansonsten stimmen die Zeiten wieder nicht.

Dem 2-ten Punkt könnte man durch
void _delay( int ms )
{
  int i;
  for( i = 0; i < ms; ++i )
    _delay_ms( 1 );
}
etwas entgegenwirken. Aber den ersten Punkt (Optimizer) wird man so 
nicht los.

> Ich verstehe nicht ganz den Sinn der oberen Anweisung.
> Zuersteinmal könnte man die Zeile doch auf
>
> _delay_loop2((F_CPU/250)*miliSec);//4 Zyklen Warteschleife
> 
> kürzen

könnte man.
Aber dann würdest du fragen, wo eigentlich die 250 her kommen.

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh, OK.
Danke für die schnelle Antwort.
Ich glaube, im Tutorial HIER für die LCD-Ansteuerung in GCC bin ich 
deutlich besser aufgehoben.
Muss nur noch die Ports rausfinden, die benutzt werden.
Ich hab mir jetzt mal den Rest von dem Quatsch angesehen und habe 
herausgefunden, dass mit AVR-Studio und GCC da gar kein Durchkommen ist.
Zum Beispiel verwenden die extrem häufig die Funktion sbi(PORT,Bit) oder 
cbi(PORT,Bit). Problem dabei: Die gibts doch gar nicht in GCC???
Ich bin echt froh, dass wir hier ein so gutes Forum und so geniale 
Tutorials haben. Ohne Mikrocontroller.net wäre ich in 10 Jahren noch 
nicht fertig...
Mit freundlichen Grüßen,
Valentin Buck

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Valentin Buck schrieb:

> herausgefunden, dass mit AVR-Studio und GCC da gar kein Durchkommen ist.
> Zum Beispiel verwenden die extrem häufig die Funktion sbi(PORT,Bit) oder
> cbi(PORT,Bit). Problem dabei: Die gibts doch gar nicht in GCC???

Sind aber leicht zu machen
#define sbi(port,bit)   (port) |= (1<<(bit))
#define cbi(port,bit)   (port) &= ~(1<<(bit))

Zur Ehrenrettung: die Funktionen gab es früher einmal. Damals war 
anscheinend der Optimizer noch nicht soweit, dass er die obigen 
C-konformen Konstrukte in die AVR spezifischen Spezialanweisungen sbi 
und cbi umsetzen konnte. Daher hat man dem Compiler ein bischen unter 
die Arme gegriffen.

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!!! Jetzt wird mir vieles klarer.
Ich bräuchte da trotzdem noch ein wenig Hilfe:
In dem Tutorial steht in der lcd-routines.h
folgendes:
// DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden 
In dem myAVR-Heft steht aber PD4 bis PD7 sind mit DB4 bis DB7 verbunden.
Wo kann ich das ändern?
Mit freundlichen Grüßen,
Valentin Buck

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Sind aber leicht zu machen
> #define sbi(port,bit)   (port) |= (1<<(bit))
> #define cbi(port,bit)   (port) &= ~(1<<(bit))

Sind sogar noch leichter zu machen:
#include <compat/deprecated.h> 

Oliver

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Valentin Buck schrieb:
> Danke!!! Jetzt wird mir vieles klarer.
> Ich bräuchte da trotzdem noch ein wenig Hilfe:
> In dem Tutorial steht in der lcd-routines.h
> folgendes:
> // DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden
> 
> In dem myAVR-Heft steht aber PD4 bis PD7 sind mit DB4 bis DB7 verbunden.
> Wo kann ich das ändern?


Die sind leider in den Tutorial Routinen fix vercodet und bis jetzt hat 
sich noch niemand gefunden, der das endlich mal behebt :-) (*)

Die Belegung wirkt sich in den Funktionen
lcd_data
lcd_command
aus. Die basieren auf dieser Zuordnung.
Ausserdem ist der Anfang der lcd_init auf diese Belegung angewiesen

(*) Wäre gar nicht so schwer, das zu beheben. Der Schlüssel ist eine 
neue Funktion
void lcd_nibble( uint8_t nibble );
die ein Nibble auf die entsprechenden Pins aufteilt und die von den 
genannten Stellen benutzt wird.

Wenn du drann bleibst, mach ich mal einen Vorschlag, den du testen 
kannst und den wir dann ins Tutorial übernehmen.



Edit:
Hab mich geirrt, hier gibt es schon eine entsprechende Erweiterung
http://www.mikrocontroller.net/articles/Erweiterte...

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Erweiterung ist ja super!!!
DANKE!!!
Es funktioniert!
Mit freundlichen Grüßen,
Valentin Buck

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.