www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Miniscript - Fehler - bitte helft mir


Autor: Bitte einen Namen eingeben oder einloggen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und Guten Abend,
ich hab kurz was hingeschrieben, hier der Quelltext:
#include <avr/io.h>

int main()
{
  DDRB = (1 << PB1 );

  while( 1!=2 )
  {
    if ( PIND & (1<<PIND2) )
    {
      PORTB = (1<<PB1);
    }

    else
    {
      DDRB = (1 << PB1 );

      TCCR1A = (1<<COM1A1) | (1<<WGM11);
        TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);

      ICR1 = 0x6FFF;

        OCR1A = 0x10FF;
    }
  }
}

Ich will dass eine LED per PWM auf einer bestimmten Helligkeit leuchtet 
und wenn ich den Taster drücke, soll sie hell Leuchten.

Leider funktioniert das ganze irgendwie nicht. Wenn ich beim resetten 
den Taster drücke ist die LED hell und wenn ich sie loslasse wird sie 
dunkler.
Resette ich ohne den Taster zu rücken ist sie gleich gedimmt.
Wenn ich aber dann die Taste drücke bleibt die LED gedimmt.

Wenn ich in AVR Studio debugge läuft das alles... Das heißt er Springt 
in den richtigen if teil.

Das ganze läuft auf einem Atmega8.

Danke

Autor: Scripter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
c ist eine Script-Sprache, wusste ich noch gar nicht... Welchen 
C-Interpreter verwendest du?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sobald Du die PWM einmal eingeschaltet hast, bleibt sie ein.
Du musst im ersten Zweig auch die PWM abschalten.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>TCCR1A = (1<<COM1A1) |....

Damit koppelst du dein Pin von den 'normalen' Portfunktionen ab.
Ein

> PORTB = (1<<PB1);

bleibt wirkungslos.

MfG Spess

Autor: Bitte einen Namen eingeben oder einloggen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke. so tuts jetzt...
#include <avr/io.h>

int main()
{
  DDRB = (1 << PB1 );

  while( 1!=2 )
  {
    if ( PIND & (1<<PIND2) )
    {
      TCCR1A = (0<<COM1A1) | (0<<WGM11);
        TCCR1B = (0<<WGM13) | (0<<WGM12) | (0<<CS10);

      PORTB = (1<<PB1);
    }

    else
    {
      DDRB = (1 << PB1 );

      TCCR1A = (1<<COM1A1) | (1<<WGM11);
        TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);

      ICR1 = 0xFFFF;

      OCR1A = 0x3FFF;
    }
  }
}

Autor: Bitte einen Namen eingeben oder einloggen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> c ist eine Script-Sprache, wusste ich noch gar nicht... Welchen
> C-Interpreter verwendest du?

Es ist aber gegen meine Stolz diese paar Zeilen 'Quatschcode' als 
Programmieren zu bezeichnen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Warum so kompliziert?

COM1A1/COM1A0 auf 'Set OC1A on Compare Match' setzen (11) und FOC1A in 
TCCR1A setzen.

MfG Spess

Autor: Scripter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na dann hoffe ich, dass du schon den Unterschied zwischen Interpreter 
und Compiler kennst, auch wenn es dein(e) Stolz nicht zulässt...

Autor: Bitte einen Namen eingeben oder einloggen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> na dann hoffe ich, dass du schon den Unterschied zwischen Interpreter
> und Compiler kennst, auch wenn es dein(e) Stolz nicht zulässt...

Boah ja, ich kenn ihn. Was soll denn diese i-dipfales-scheißerei?

Also, geh deine Frau ärgern!

Autor: Bitte einen Namen eingeben oder einloggen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, ich hätte das gerne per Interrupt gemacht, aber ich bin zu blöd 
dazu.
Würd mich freuen wenn mir jemand dabei helfen kann.

Der Taster hängt an PD2 bzw. int0.

Danke

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ach ja, ich hätte das gerne per Interrupt gemacht, aber ich bin zu blöd
dazu.Würd mich freuen wenn mir jemand dabei helfen kann.

Dumme Idee. Hast du eine Vorstellung, wie viele Interrupts dein Taster 
auslöst?

MfG Spess

Autor: Scripter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Informatik ist eine ernter Wissenschaft und nicht irgendwas "nach 
Gefühl"

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Informatik ist eine ernter Wissenschaft und nicht irgendwas "nach
>Gefühl

Und wo bleibt dann der Spass?

MfG Spess

Autor: kurz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tasten per Interrupt, noch dazu bei so einer simplen Aufgabenstellung, 
ist immer wieder nett zu lesen.

Vielleicht verrät mal ein User warum er einen Interrupt für so etwas 
braucht? Warum er sich in die Welt der prellenden Schalter begeben will? 
Was eigentlich ein Hauptprogramm noch machen soll?

Wär doch mal eine Idee: Ein uC, der nur mit Interruptroutinen läuft, 
kein Main mehr braucht, die beliebten Zeitschleifen hardwäremäßig 
realisiert, einen C-Interpreter auf dem Chip hat.


Nun im Ernst: Wozu Interrupt für die Taste?

Autor: Scripter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... auf jeden Fall nicht dabei, dass man irgendwelche eindeutige 
Definitionen(!) verdreht..., sondern dabei, durch logisches Überlegen, 
triviale Fehler findet...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Scripter schrieb:
> Informatik ist eine ernter Wissenschaft

Tatsächlich? Und ich dachte, Agronomie wäre die einzige 
Ernter-Wissenschaft. ;-)

Autor: Maxxie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Nun im Ernst: Wozu Interrupt für die Taste?"

Um ihn den Rest der Zeit ins idle zu setzen.


Methoden um das Prellen zu berücksichtigen, ob nun in HW oder SW, die 
implementiert man einmal und kann sie immer wieder verwenden.

Polling (busy waiting im Allgemeinen) ist meines Erachtens etwas, dass 
man ,wo man es kann, vermeiden sollte. Auch für soetwas Kleines.

Autor: Bitte einen Namen eingeben oder einloggen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz ehrlich, einfach nur um zu sehen wie es funktioniert.
Ich bin mit dem AVR-GCC Tutorial hier auf der Seite leider nicht 
weitergekommen...

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.