mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit C


Autor: Florian S. (fuxreid)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich habe das Problem dass die LED an Port PB0 nicht leuchtet, wenn mein 
timer "in Betrieb" ist, obwohl ich denke, alles richtig gemacht zu 
haben.
Da ich noch recht neu in der Thematik bin, brauch ich bitte Eure Hilfe.

Hier ein Code-Auszaug:

char x=1;   // timer0 verwaltung
char a=0;   // minuten anzahl manuell
char sekunden=0;
char last=0;

int main(void)
{
  DDRB |= (1<<DDB0); // PORTB 0 als ausgang
  DDRD = 0xFF;       // PortD alles als Ausgang
  DDRC &= ~ (1<<DDC0) | (1<<DDC1) | (1<<DDC2);   // PORTC 0...2 als 
Eingang
  DDRC |= (1 << DDC3) | (1 << DDC4) | (1 << DDC5); // PortC 3..5 als 
Ausgang
  PORTC |= (1 << PC3) | (1 << PC4) | (1 << PC5);// PORTC 3..5 High = 
Digits aus

  // Timer 1 konfigurieren
  TCCR1A = (1<<WGM12);   // CTC Modus
  TCCR1B |= (1<<CS10);  // Prescaler 64
  OCR1AL = 125-1;       // ((8000000/64)/1000) = 125
  TIMSK |= (1<<OCIE1A); // Compare Interrupt erlauben
  TIFR |= (1<<OCF1A);   // Output Compare A Match Flag

  // Timer 0 konfigurieren
  TCCR0 = (1<<CS01) | (1<<CS00);
  TIMSK |= (1<<TOIE0);
  TIFR |= (1<<TOV0);
  sei();       // Global Interrupts aktivieren


  while (1)  // Endlos
  {

  if(last==1)  // Last einschalten
    {
    PORTB &= ~ (1<<PB0);
    }
  if(last==0)  // Last auschalten
    {
    PORTB |= (1<<PB0);
    }
  }
  return 0;
  }

ISR (TIMER1_COMPA_vect)

{
if (minute<a | sekunde<59)// Timerlaufzeit definieren
  {
  v=1;
  millisekunden++;
  if(millisekunden == 120)
    {
    sekunde++;
    millisekunden = 0;
    if(sekunde == 60)
      {
      minute++;
      sekunde = 0;
      }
      if(minute == 9)
      {
      minute = 0;
      }
    }
  }
  else
  {
  last=0;
  }
}


Wär super wenn ihr mir helfen könntet. Im Anhang ist noch der komplette 
Code.

GLG

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile (zumindest bei last, anderes nicht geprüft).

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stichwort volatile, siehe Interrupt.

MfG
Falk

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu langsam :-0

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Gut. Dann beginnen wir erst mal mit dem lustigen Controller-Raten.

ATMEGA16? Wer bietet mehr?

MfG Spess

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian S. schrieb:
> if (minute<a | sekunde<59)// Timerlaufzeit definieren

Du willst ein logisches OR, schreibst aber binäres OR.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In deinem Programm wird eher dein ISR vom Timer0 blockieren als dein 
Timer1-Compare.

So nebenbei:

Florian S. schrieb:
> if (minute<a | sekunde<59)// Timerlaufzeit definieren

sollte wohl so gemeint sein:

if(minute<a || sekunde<59)  //logisches Oder statt bitweise Oder

Außerdem versteh ich deine Zeitzählung nicht:
120 Millisekunden ergeben dann 1 Sekunde ?? Da passt was nicht.

Autor: Florian S. (fuxreid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also erst mal Danke für die schnellen Antworten!!!!

Den Fehler mit dem logischen || und mit dem volatile hab ich trotz 100 
mal lesen einfach ned gesehen! Danke!

@  spess53 (Gast):
Controller hab ich einen Atmega8 verwendet.

@ Flo (Gast):
die 120 statt 1000ms hab ich nur testweise eingesetzt, damit die Uhr 
während der Entwicklung ein bisschen schneller geht^^

Aber ich habe noch eine ganz andere Frage:

Wie kann ich einen Summer an meinen Atmega8 anschließen?
Die Ansteuerung wird ja dann über einen Timer mit der richtigen Frequenz 
laufen, oder?

Wär super wenn Ihr mir nochmal auf die sprünge helfen könntet!

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Es gibt auch Summer, die ganz von sich aus 'Laut geben'. Einfach an 5V 
anhängen und das Teil quäkt vor sich hin.

Autor: Florian S. (fuxreid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz

danke für die Info. Ich hab ein bisschen geschaut, aber die sind ja doch 
relativ teuer....

http://www.conrad.de/ce/de/product/751898/SUMMER-4...

Ich würde gerne einen einfachen Piezo-Signalgeber einbauen:

http://www.conrad.de/ce/de/product/541347/SIGNALGE...


Was für eine Schaltung ist dafür notwendig??

Wäre super, wenn Du mir helfen könntest!!

MfG

Autor: Florian S. (fuxreid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ich habe noch ein weiteres Problem bei einem komplett anderen Code, 
wieder ATMEGA8 und die Hardware muss eigentlich richtig angeschlossen 
sein. Das Programm soll nichts anderes können, als bei Druck eines 
Tasters eine andere LED einzuschalten. Wie ein kleines "Menü".

Wär super wenn mir nochmal jemand einen Tipp geben könnte warum meine 
Taster in dem Programm keine Auswirkungen zeigen, also gar nichts 
machen!!

Danke schon Mal!!!!



#include <avr/io.h>
#include <util/delay.h>

volatile unsigned int modus=3;

void delay_ms (uint16_t ms)
{
  for(uint16_t t=0; t<=ms; t++)
  _delay_ms(1);
}

int main(void)
{
  DDRC &= ~ (1<<DDC4) | (1<<DDC5);
  DDRD |= (1<<DDD0) | (1<<DDD1) | (1<<DDD2) | (1<<DDD3) | (1<<DDD4) | 
(1<<DDD5);
  PORTD |= (1<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3) | (1<<PD4) | 
(1<<PD5);

  while (1)
  {
  if (PINC & (1<<PINC4))
    {
    if (modus<5)
      {
      modus++;
      delay_ms(100);
      }
    }
  if (PINC & (1<<PINC5))
    {
    if (modus>1)
      {
      modus--;
      delay_ms(100);
      }
    }
  if(modus==1)
    {
    PORTD &= ~ (1<<PD0);
    PORTD |= (1<<PD1);
    }
  if(modus==2)
    {
    PORTD &= ~ (1<<PD1);
    PORTD |= (1<<PD0) | (1<<PD2);
    }
  if(modus==3)
    {
    PORTD &= ~ (1<<PD2);
    PORTD |= (1<<PD1) | (1<<PD3);
    }
  if(modus==4)
    {
    PORTD &= ~ (1<<PD3);
    PORTD |= (1<<PD4) | (1<<PD2);
    }
  if(modus==5)
    {
    PORTD &= ~ (1<<PD4);
    PORTD |= (1<<PD3);
    }
    return 0;
  }
 }

Autor: Jonas Mitschang (jonen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
return ?

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

Bewertung
0 lesenswert
nicht lesenswert
Da ist erst mal der return in der Schleife

Deine Taster werden höchst wahrscheinlich nach Masse schalten.
Daher sind deine Abfragen grundsätzlich falsch rum.

Aber:
Du musst unterscheiden zwischen
  mache etwas 'solange eine Taste gedrückt ist'
und
  mache etwas 'wenn eine Taste gedrückt wird'

Du willst höchst wahrscheinlich ersteres, hast aber letzteres 
programmiert.

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

Autor: Florian S. (fuxreid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort!

Es lag nur an dem return erstmal.
Für was steht das return?

Nach Entfernen des return "laufen die LEDs nacheinander geplant durch". 
Was müsste ich denn schreiben, damit erst wieder auf die nächste LED 
geschaltet wird, wenn ich den Taster losgelassen habe und erneut drücke?

MfG

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian S. schrieb:
> Für was steht das return?

Darauf willst du jetzt eine Antwort?

Autor: Florian S. (fuxreid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tut mir leid, wenn die Frage so dumm klingt, aber ich habe vor diesem 
Projekt ein ähnliches Programm geschrieben in dem auch zum schluss 
return stand. Da hat aber alles funktioniert...

Nur desshalb frag ich, aber viel wichtiger wär mir wie ich das schreibe 
mit den Tastern.

MfG

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

Bewertung
0 lesenswert
nicht lesenswert
Florian S. schrieb:
> Tut mir leid, wenn die Frage so dumm klingt, aber ich habe vor diesem
> Projekt ein ähnliches Programm geschrieben in dem auch zum schluss
> return stand. Da hat aber alles funktioniert...

Dein return steht aber nicht zum Schluss :-)

in deinem anderen Projekt hattest du
...
int main()
{
  ...

  while( 1 ) {
    ...
  }

  return 0;
}

Hier hast du
...
int main()
{
  ...

  while( 1 ) {
    ...

    return 0;
  }
}

Und für die Frage, was der return macht: Bitte besorg dir ein C-Buch. Du 
wirst nicht glücklich werden ohne.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was den Summer angeht:
Einfach an einen Portpin anschließen und den Pin mit der richtigen 
Frequenz (für maximale Lautstärke die Resonanzfrequenz des 
Piezolautsprechers) toggeln lassen.
Vielleicht noch einen kleinen Vorwiderstand von 100R davor.

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.