www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Displayausgabe langsam trotz 16Mhz


Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute...

Ich habe testweise ein Programm geschrieben welches mir die Zeit anzeigt 
wie lange eine Taste gedrückt ist. Hintergrund ist, ich möchte die 
Durchflussmenge einer Pumpe messen. Drücke ich den Starttaster rennt die 
Pumpe und mein Timer los. Lasse ich die Taste los stoppt der Timer und 
die Zeit wird im Display angezeigt.
Die Pumpe wird über nen Zweiten Timer im FastPWM-Modus angesteuert.

Was ich aber nicht verstehe, ich kann dem LCD zusehen wie es Zeichen für 
Zeichen schreibt. Ist also extremst lahm das ganze. Mein Controller 
läuft mit 16Mhz und ist ein ATmega32.

Bevor die Displayausgabe erfolgt, wird der Timer für die Zeitmessung 
angehalten, der PWM Timer läuft zu dieser Zeit aber noch.
Mir ist aufgefallen, wenn ich den PWM-Timer erst garnicht initialisieren 
und dann meine Zeit messe, erfolgt die Ausgabe minimal schneller. Aber 
das kann doch eig. garnicht damit zusammenhängen oder? Der Timer läuft 
ja hardwareseitig?

Hat da jemand eine Idee zu?
Achso... Programm in C geschrieben.

Danke schonmal.

Autor: ALU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rush. schrieb:
> Programm in C geschrieben

Schau mal in Zeile 42.
Da scheint etwas nicht zu stimmen.

A.L.U.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Achso... Programm in C geschrieben.

Entschuldige. Aber das ist die einzige nachvollziehbare Information.

MfG Spess

Autor: geil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
haha wie geil is das denn... 1+1=2 aber nicht für jeden!

denke auch 42 is der fehler

Autor: philip Siefke (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was die geschäzten Vorposter auszudrücken versuchen ist, dass ohne 
deinen Quellcode mit Hilfe nicht zu rechnen ist.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Hat da jemand eine Idee zu?
> Achso... Programm in C geschrieben.

Am C wird es vermutlich nicht liegen, man soll damit auch 
funktioniertende Programme schreiben können.

Mit anderen Worten: Man wird Dir besser helfen können, wenn Du Deinen 
Quelltext zeigst. ;-)

...

Autor: ALU (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rush. schrieb:
> Ich habe testweise ein Programm geschrieben

Hallo Rush.

wenn du den Inhalt von diesem Programm für dich
behältst, kann dir hier niemand wirklich helfen.
Als lüfte dieses Geheimnis für uns alle.

A.L.U.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ja gut ist ja gut :-D
#include <avr/io.h>
#include <avr/interrupt.h>
#include "lcd-routines.h"
#include <stdlib.h>

extern void lcd_data(unsigned char temp1);
extern void lcd_command(unsigned char temp1);
extern void lcd_enable(void);
extern void lcd_init(void);
extern void lcd_home(void);
extern void lcd_clear(void);
extern void set_cursor(uint8_t x, uint8_t y);
extern void lcd_string(char *data);

volatile int i=0;
volatile float ms=0;

void init_io(void)
{
  DDRD = 0b00010010;      //PD4 Ausgang
  PORTD &=~ (1<<PB1);
  DDRB = 0;
  PORTB = 255;
  
}

void init_pwm(void)
{
/*  TCCR1B-Registeraufbau   ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
  
  CS12 CS11 CS10 Description
   0    0    0    No clock source (Timer/Counter stopped).
   0    0    1    clkI/O/1 (No prescaling)
   0    1    0    clkI/O/8 (From prescaler)
   0    1    1    clkI/O/64 (From prescaler)
   1    0    0    clkI/O/256 (From prescaler)
   1    0    1    clkI/O/1024 (From prescaler)

  TCCR1A-Registeraufbau   COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10

   COM1A1/COM1B1 COM1A0/COM1B0 Description
         0             0        Normal port operation, OC1A/OC1B disconnected.
         0             1        WGM13:0 = 15: Toggle OC1A on Compare Match, OC1B disconnected (normal port operation).
                                For all other WGM13:0 settings, normal port operation, OC1A/OC1B disconnected.
         1             0        Clear OC1A/OC1B on compare match, set OC1A/OC1B at BOTTOM, (non-inverting mode)
         1             1        Set OC1A/OC1B on compare match, clear OC1A/OC1B at BOTTOM, (inverting mode)
  */
 
  TCCR1A |= (1<<COM1B1) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10);  // 10 Bit FastPWM - clear at bottom, set on compare match  invertiert
  TCCR1B |= (1<<WGM12) | (1<<CS11) | (1<<CS10);
}

void init_timer0(void)
{
  OCR0 = 63;                  // ((16000000Hz/256)/1000Hz) = 62,5 für 1ms
  TIMSK = (1<<OCIE0);              // enable interrupts on compare match
}

void activate_timer0(void)
{
  TCCR0 = (1<<WGM01) | (1<<CS02);  //prescaler 256; CTC-Mode
  sei();
}

void deactivate_timer0(void)
{
  cli();
  TCCR0 = (0<<CS02) | (0<<CS01) | (0<<CS00);  //prescaler 1024; CTC-Mode
}

void rst_timer0(void)
{
  ms = 0;
  i = 0;
}

void ShowTime(void)
{
  unsigned char milliseconds[6];
  lcd_clear();
  set_cursor(0,0);
  ms = ms / 1000;
  dtostrf(ms, 3,3, milliseconds);
  lcd_string(milliseconds);
}

ISR(TIMER0_COMP_vect)
{
  cli();
  if (i < 50)
    {
    i++;
  }
  else
  {
     ms++;
  }
  sei();
}

int main(void)
{
  init_io();
  init_pwm();
  lcd_init();
  init_timer0();
  lcd_clear();
  set_cursor(0,0);
  sei();

  while (1)
  {
    if ( !(PINB & (1<<PINB0)) )
  {
    activate_timer0();          // Timer aktivieren
    while (i < 50) {}              // warten bis Taster vollständig gedrückt - Prellen unterdrücken
      OCR1B = 1023;              // DC 1,0    13,8 V
    while ( !(PINB & (1<<PINB0)) ) {}
    deactivate_timer0();
    OCR1B = 0;
    ShowTime();
      rst_timer0();
  }

  while ( !(PINB & (1<<PINB2)) )
  {
    activate_timer0();          // Timer aktivieren
    while (i < 50) {}              // warten bis Taster vollständig gedrückt - Prellen unterdrücken
    OCR1B = 819;              // DC ~0,8   11,03 V
    while ( !(PINB & (1<<PINB0)) ) {}
    deactivate_timer0();
    ShowTime();
      rst_timer0();
  }

  while ( !(PINB & (1<<PINB4)) )
  {
    activate_timer0();          // Timer aktivieren
    while (i < 50) {}              // warten bis Taster vollständig gedrückt - Prellen unterdrücken
    OCR1B = 615;              // DC ~0,6   8,29 V
    while ( !(PINB & (1<<PINB0)) ) {}
    deactivate_timer0();
    ShowTime();
      rst_timer0();
  }

  while ( !(PINB & (1<<PINB6)) )
  {
    activate_timer0();          // Timer aktivieren
    while (i < 50) {}              // warten bis Taster vollständig gedrückt - Prellen unterdrücken
    OCR1B = 411;              // DC ~0,4   5,54 V
    while ( !(PINB & (1<<PINB0)) ) {}
    deactivate_timer0();
    ShowTime();
      rst_timer0();
  }

  while ( !(PINB & (1<<PINB1)) )
  {
    activate_timer0();          // Timer aktivieren
    while (i < 50) {}              // warten bis Taster vollständig gedrückt - Prellen unterdrücken
    OCR1B = 207;              // DC ~0,2   2,79 V
    while ( !(PINB & (1<<PINB0)) ) {}
    deactivate_timer0();
    ShowTime();
      rst_timer0();
  }

  OCR1B = 0;
  }
  return 0;
}

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ja alles blockierend ... uiiiiiii.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gibts irgend einen bestimmten Grund für ms float zu verwenden?
Die float-Berechnungen werden dich ordentlich Prozessorzeit kosten.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Nur auf den ersten Blick:

Den exzessiven Gebrauch von 'sei()' und 'cli()' solltest du tunlichst 
vermeiden.

MfG Spess

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rush. schrieb:
> ISR(TIMER0_COMP_vect)
> {
>   cli();
>   if (i < 50)
>     {
>     i++;
>   }
>   else
>   {
>      ms++;
>   }
>   sei();
> }

unnötig in der ISR cli/sei zu verwenden. evtl kostest das ewige 
ein/ausgeschalte cpu-zeit.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vergesst das sei/cli. Ohne hatte ich das selbe Problem, deshalb hab ich 
es testweise mit reingeschrieben.

@Gleicher Tag
Was meinst du mit blockierend?

Klär mich mal bitte auf, stehe sogesehen noch im Anfangsstadium der 
uC-Programmierung.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Flo

Bezüglich des Float.
Will die Zeit gerne mit Nachkommastellen haben. Aber wenn du schon 
fragst dann gibts sicherlich elegantere Möglichkeiten.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>vergesst das sei/cli. Ohne hatte ich das selbe Problem, deshalb hab ich
>es testweise mit reingeschrieben.

Du schaltest aber bei einem

>void deactivate_timerXY(void)

auch alle Interrupts ab. Ist das gewollt?

MfG Spess

Autor: Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
16MHz Quarz angeschlossen, 1MHz interner takt ist noch aktiv !?

Joe

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@spess53
Ja das ist gewollt mit den Interrupts. Benutze ja nur einen einzigen zum 
Zählen der Millisekunden. Und den brauche ich ja nicht mehr wenn der 
Taster losgelassen wurde.

@Joe
Ne, der Takt ist auf externen Quarz eingestellt.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In den Optionen sind die 16Mhz übrigens auch eingetragen.

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ rush. ist das display nur lahm wenn du deine  starttaste drückst?

wenn das so ist blockiert evtl deine entrellschleife?.
dann vielleicht den tasterzusatnd über die ISR mit abwicklen? bin auch 
erst neu dabei, von daher ne vermutung?

(hab mal zum test mehrer tasten  über die timer ISR "mit" abgefragt. 
klappt wunderbar, inkl timerausgabe LCD)

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Erstz für float lässt sich mit Festkommaarithmetik arbeiten:

http://www.mikrocontroller.net/articles/Festkommaarithmetik

;-) Schont die Rechenzeit

Autor: jl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schalt mal um
   lcd_string(milliseconds);
die interrupts ab,

wenns dann funktioniert ist ein interrupt ständig am werkeln.
Ansonsten ists eher in der funktion zu suchen.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Anfaenger schreibt man ein Programm gewoehnlich blockierend. Das 
bedeutet, das Programm steht immer an einer definierten Stelle und 
wartet auf genau ein Ereignis, und tut waehrend dieser (Warte-)Zeit 
nichts.
Der Zeitablauf ist genau vorgegeben.

Als Fortgeschrittener schreibt man nicht mehr blockierend. Man reagiert 
auf ein Ereignis wenn es auftritt, und wartet nicht mehr. Der Zeitablauf 
ist nicht mehr genau vorgegeben. Falls ein Ablauf eingehalten werden 
muss, so bedient man sich einer Statusmaschine.

Toent etwas theoretisch. ja.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@swen

ne, das display ist auch lahm wenn ich einen string direkt in der 
while(1) schreibe ohne eine taste zu drücken.

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist das timing in der lcd-routine.h für 16mhz angepasst?

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
swen schrieb:
> ist das timing in der lcd-routine.h für 16mhz angepasst?


icht meinte in der lcd-routines.h ;)

Autor: Thomas R. (tinman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann sein das in der #include "lcd-routines.h" auch die Taktfrequenz 
eingetragen werden muss ?

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Taktfrequenz kann entweder in der lcd-routines.h eingetragen werden 
ober aber im Avr-Studio unter den Projektoptionen. Dort stehen die 16Mhz 
drin. Dieser Eintrag bezieht sich ja auf das komplette Projekt. Schreibe 
ich es zusätzlich in die lcd-routines.h kommt erstens ne warnmeldung vom 
compiler "F_CPU redefined in...." und zweitens ändert es an meinem 
Problem trotzdem nichts.

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann mach mal stück für stück dein programm "kleiner" und beobachte das 
display.

trial & error :)

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was will ich denn da groß kleiner machen?
Schmeisse die initialisierung fürs pwm raus und mehr geht sogesehen 
garnicht. sind doch  nur tasterabfragen.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ein Programm nicht debug-bar ist, sollte man's wegschmeissen und 
neu beginnen.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, eben einfach mal das hier geschrieben:
#include <avr/io.h>
#include "lcd-routines.h"

extern void lcd_data(unsigned char temp1);
extern void lcd_command(unsigned char temp1);
extern void lcd_enable(void);
extern void lcd_init(void);
extern void lcd_home(void);
extern void lcd_clear(void);
extern void set_cursor(uint8_t x, uint8_t y);
extern void lcd_string(char *data);
extern void lcd_led(uint8_t a);



int main(void)
{
lcd_init();

lcd_string("alsdjadsf");
}

und es ist immer noch so lahm.
Einen anderen Port habe ich eben auch mal versucht, das selbe :-(

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na selbst die festellung ist ne amtliche aussage! da steckt der fehler 
wohl nicht im programmteil/ISR teil. schalt mal bitte auf int rcosc um. 
evtl hat dein quarz probleme (kontakt, kapazitäten...)

Autor: Zaphod Beeblebrox (brezel) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jl schrieb:
> schalt mal um
>    lcd_string(milliseconds);
> die interrupts ab,
>
> wenns dann funktioniert ist ein interrupt ständig am werkeln.
> Ansonsten ists eher in der funktion zu suchen.

hast du das probiert? wär doch die erste Einschränkung der Fehlerquelle!

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rush. schrieb:
> extern void lcd_data(unsigned char temp1);
> extern void lcd_command(unsigned char temp1);
> extern void lcd_enable(void);
> extern void lcd_init(void);
> extern void lcd_home(void);
> extern void lcd_clear(void);
> extern void set_cursor(uint8_t x, uint8_t y);
> extern void lcd_string(char *data);
> extern void lcd_led(uint8_t a);

ich weiss eigentlich garnicht warum das alles da rein muss...

wenn ich lcd routines verlinke brauch ich garnichts davon

Autor: Zaphod Beeblebrox (brezel) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
geht mir zu schnell hier -.-

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zaphod Beeblebrox schrieb:
> geht mir zu schnell hier -.-

da haste wohl nen schnelles LCD :D

Autor: Zaphod Beeblebrox (brezel) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wer weiß, meins liegt noch jungfräulich unverzinnt im Keller...

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den Takt mal auf den default von 1Mhz gestellt und die 
Projektoptionen angepasst. Das selbe!

@swen

Gute Frage ob ich das brauche oder nicht. In früheren Verisonen vom 
avr-gcc hat er mir immer ne Fehlermeldung ausgespuckt. Ein Freund hat 
mir dann geraten das extern immer mit reinzunehmen damit der Compiler 
von vorn herein weiss das die Funktionen eben extern liegen.
Habs jetzt rausgenommen und das LCD geht trotzdem, aber langsam eben :-(

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat das lcd jemals "schnell" angezeigt? nich das hier der "wurm liegt". 
evtl haste ja noch nen zweiten controller zum probieren. nur um das 
unvorstellbare auszuschließen. weil dann wäre ich auch mit meinem latein 
am ende

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das hat die ganze Zeit normal funktioniert.
Aber ich werds nochmal auf einem anderen Controller probieren. Hab nur 
gerade keinen anderen parat.
Aber werde dann meine Erkenntnisse posten.
Danke schonmal für eure Bemühungen.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir noch einfällt...
Kann mein Problem auch vom Programmer abhängen?
Habe das Evertool Teil mal nachgebaut, da ist aber noch eine uralte 
Firmware drauf.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Rush. (Gast)

Kleiner Tip: Netiquette. Lange Quelltexte gehören in den Anhang. Und 
es wäre sinnvoll, den AVR-Typ zu nennen.

Wenn dein AVR so schnarchlangsam ist, kann es sein dass er mit dem 
Watchdogtimer mit 128 kHz läuft, das geht bei einigen AVRs. Oder du hast 
das define F_CPU in Makefile oder den Projektoptionen im AVR-Studio 
falsch eingestellt. Hast du jeweils neu compiliert und auch neu 
programmiert?

Zum Thema nichtblockierende Programmierung siehe Multitasking.

MfG
Falk

Autor: Andreas W. (geier99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rush. schrieb:
> In den Optionen sind die 16Mhz übrigens auch eingetragen.

welche Optionen meinst Du?

Wie sind die Fusesettings für den Takt programmiert?
Wie ist CKDIV8-Fuse programmiert?

Am besten gibts Du uns mal den Prozessortyp und die 3 Fusebytes an.

Bye
Andi

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Falk

Falk Brunner schrieb:
> Kleiner Tip: Netiquette. Lange Quelltexte gehören in den Anhang. Und
> es wäre sinnvoll, den AVR-Typ zu nennen.

Wenn du schon von Netiquette sprichst solltes du dich selber dran halten 
und wenigstens das erste Posting überfliegen:

Rush. schrieb:
> Mein Controller
> läuft mit 16Mhz und ist ein ATmega32.

Wie wenn ATmega32 nichts aussagen würde...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Michael (Gast)

>Wie wenn ATmega32 nichts aussagen würde...

Das hab ich dann wohl übersehen. Entschuldigung.

@Rush

Ob die Takteinstellung passt kann man leicht mit folgendem Programm 
prüfen.

#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>

int main(void) {
    int i;
    
    DDRA = 1;    // ein Port mit ner LED dran     

    while (1) {
        for (i=0; i<1000; i++) _delay_ms(1);
        PORTA ^= 1; 
    }
}

Du musst natürlich das Programm an deine Pinbelegung anpasssen. Wenn die 
LED im Sekundentakt blinkt ist deine Oszillatoreinstellung OK.

MFG
Falk

Autor: Rush. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Michael

Das Timing meines Programms passt da ich ja wie schon am Anfang 
geschrieben die Dauer des gedrückten Tasters messe und diese auch 
korrekt am display angezeigt wird.

Im Anhang meine Fuses und die Optionen aus dem AVR-Studio als 
Screenshot.

@ Falk Brunner

Ich habe den Watchdog doch im Code nirgends initialisiert, also läuft er 
doch garnicht oder?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Rush. (Gast)

>Im Anhang meine Fuses und die Optionen aus dem AVR-Studio als
>Screenshot.

Das passt alles.

>Ich habe den Watchdog doch im Code nirgends initialisiert, also läuft er
>doch garnicht oder?

Das ist was anderes. Bei einigen AVRs kann man den Watchdogoszillator 
als Taktquelle auswählen, aber nicht beim Mega32.

MfG
Falk

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das ganze eben nochmal mit einem anderen Controller versucht und 
die Ausgabe ist immer noch so langsam.
Ob evtl. mein Display einen Schlag hat ?! Wobei, es lief eig. immer ganz 
zuverlässig.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ob evtl. mein Display einen Schlag hat ?! Wobei, es lief eig. immer ganz
>zuverlässig.

Nö, eher deine LCD Routinen oder der uC Takt. Da steckt doch der Wurm 
drin.
Zeig die LCD Routinen mal.

Autor: Rush. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wäre abeer schon seltsam.
Ich habe die libs von Peter Fleury. Diese ist soweit unverändert bis auf 
eine  Routine zum Einschalten der Hintergrundbeleuchtun und lief immer 
einwandfrei.
Aber schau mal drüber.

Routine hängt dran.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da haben wirs ja schon;)

// erzeugt den Enable-Puls
void lcd_enable(void)
{
   // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
einfügen
   // Beitrag "Re: Bitte helft mir. Schon wieder AtMega16"
   LCD_PORT |= (1<<LCD_EN);
    _delay_ms(90);                   // kurze Pause
   // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
verlängern
   // Beitrag "LCD -> Probleme mit Optimierungsgrad"
   LCD_PORT &= ~(1<<LCD_EN);
}


90ms für Enable ist schon etwas viel.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne quatsch, ist nicht die von Peter Fleury.

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na eeeeeeeeeeeeeeeeeeeeeendlich :-D
Danke dir vielmals 10us fürs enable tuns auch :-D

Vielen Dank für eure Bemühungen. Jetzt gehts :-)

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
}

// erzeugt den Enable-Puls
void lcd_enable(void)
{
   // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
einfügen
   // Beitrag "Re: Bitte helft mir. Schon wieder AtMega16"
   LCD_PORT |= (1<<LCD_EN);
    _delay_us(1);                   // kurze Pause
   // Bei Problemen ggf. Pause gemäß Datenblatt des LCD Controllers 
verlängern
   // Beitrag "LCD -> Probleme mit Optimierungsgrad"
   LCD_PORT &= ~(1<<LCD_EN);
}

bei ihr isses 1us!

check ma!

Autor: swen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
upps zu spät...:)

na siehste geht doch nichts über ne community ;)

Autor: Rush. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jup 1us tuts bei mir auch. Ich kann mich grob erinnern dass ich mit dem 
Wert mal rumgespielt hatte weil ich mal ein LCD hatte wo es mit 1us 
nicht lief.

So gehts einem wenn man die libs von projekt zu projekt kopiert ;-) 
Demnächst weiss ich bescheid....

Und ja, in dieser Community gehts vorwärts. Hier schreiben die leute 
schneller zurück als Freunde aus dem ICQ :-D

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.