mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einstieg in µC


Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, liebe Gemeinde ;-)

... ich arbeite mich gerade in Microcontroller ein und habe mithilfe 
eures großartigen AVR-Tutorials sogar schon ein erstes kleines 
Testprogramm auf mein "myAVR-MK3 Entwicklungsboard" geladen.

#define F_CPU 16000000

// Einbindung von benötigten Header-Dateien für:
#include <stdint.h> // standardisierte Datentypen
#include <avr/io.h> // Registernamen
//#include <util/delay.h>

// Deklaration von Variablen
uint8_t btn1;
uint8_t btn2;
uint8_t btn3;
uint8_t btnJoyL;
uint8_t btnJoyR;
uint8_t btnJoyU;
uint8_t btnJoyD;
uint8_t btnJoyX;

int main (void) {

  // alle Anschlüsse der jeweiligen Ports als Ausgänge einstellen
  DDRB = 0xff;
  DDRL = 0xff;

  // die Werte der Ausgänge festlegen ("0" bzw. "1"; s.a. http://www.mikrocontroller.net/articles/Bitmanipulation)
  //PORTB = 0b01011011;
  PORTL = 0x00;

  // PullUp-Festlegung der Eingänge (Taster)
  PINK = 0xff;

  //---------------------------------------------------------------------------------------------------------------
  // PWM-Einstellungen:
  //DDRB = (1<<PB1);
  // Einstellung des Counters als nicht invertierende 10-Bit PWM
  TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);

  // Generierung eines Taktes von CK/1024
  TCCR1B = (1<<CS12) | (1<<CS10);

  // Festlegung des Top- (End-) & Compare-Wertes
  ICR1 = 0x398;
  OCR1A = 0x199;

  //---------------------------------------------------------------------------------------------------------------

  while(1) {

    // Variablenzuweisungen...
    btn1 = PINK & 0b00000001;
    btn2 = PINK & 0b00000010;
    btn3 = PINK & 0b00000100;
    btnJoyL = PINK & 0b00010000;
    btnJoyR = PINK & 0b01000000;
    btnJoyU = PINK & 0b00001000;
    btnJoyD = PINK & 0b00100000;
    btnJoyX = PINK & 0b10000000;

    // ... und anschließende Statusabfrage der Taster-Zustände
    if (btn1 == 0) {

      PORTL = 0x00;
      PORTL |= (1<<PL7);
    }

    else if (btn2 == 0) {
      PORTL = 0x00;
      PORTL |= (1<<PL6);
    }

    else if (btn3 == 0) {
      PORTL = 0x00;
      PORTL |= (1<<PL5);
    }

    
    else if (btnJoyL == 0) {
      
    }
    else if (btnJoyR == 0) {
      
    }
    else if (btnJoyU == 0) {
      
    }
    else if (btnJoyD == 0) {
      
    }
    else if (btnJoyX == 0) {
      
    }
  }

  return 0;
}


Nun,... es läuft soweit eigentlich auch, nur verstehe ich nicht ganz, 
warum bei Abfrage meiner Taster, das "High"-Signal mit "0" gleichgesetzt 
ist. Sprich: Bei gedrücktem Taster soll die jeweils zugeordnete LED 
geschaltet werden - die LED wird aber nur bei Tast-Signal "0" 
aktiviert?!??? Und dies, obwohl das Grundgerüst aus dem Tutorial stammt.
Jemand vielleicht eine Ahnung, wo der Fehler steckt?

Die andere große Frage ist... ich hab (wie man ja im Code sieht) auch 
eine kleine PWM gebastelt, und dabei mal das Datenblatt des atMega2560 
gelesen. Ich weiß nicht ganz, ob ich es richtig verstanden habe, aber 
gibt es bei diesem µC nur einen einzigen Ausgang mit ein em 
PWM-Signal??? (ich frage, weil ich gern eine RGB-Steuerung schreiben 
würde. Kennt sich irgendjemand genauer mit diesem Board aus?

MfG, Marcel

Autor: Joachim K. (minifloat)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marci schrieb:
> // PullUp-Festlegung der Eingänge (Taster)
>   PINK = 0xff;

Das ist falsch.
DDRK = 0x00;
PORTK = 0xff;

Mit PINK = 0xff; wäre mir das zu heikel. Wenn di das PIN-Register 
beschreibst , werden im PORT-Register die entsprechenden Bits 
getoggelt.
mfg mf

PS: dein "invertierte Logik" Problem sag ich dir: deine Taster schalten 
nach Masse. Klar, dass du bei gedrücktem Taster eine 0 einliest.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Nun,... es läuft soweit eigentlich auch, nur verstehe ich nicht ganz,
>warum bei Abfrage meiner Taster, das "High"-Signal mit "0" gleichgesetzt
>ist.

Das hängt von der Beschaltung der Taster ab. Wenn die Portleitung über 
einen Pull-Up-Widerstand (kann auch der interne sein) bei offenem Taster 
auf H gezogen wird und der Taster nach GND schaltet dann, entspricht es 
deiner beschriebenen Logik.

>und dabei mal das Datenblatt des atMega2560
>gelesen. Ich weiß nicht ganz, ob ich es richtig verstanden habe, aber
>gibt es bei diesem µC nur einen einzigen Ausgang mit ein em
>PWM-Signal???

Der ATMega2560 hat vier 8-Bit und zwölf 16-Bit PWM-Kanäle.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hui... ihr seid´s ja schnell!;-))
Danke, hab´s jetzt soweit abgeändert.

@spess53:

Soweit wußte ich das auch. Ich hab nur ein Problem damit, die 
Ausgangspins dafür zu finden.
Ich hab´ nun zwar nach ein paar Stunden zumindest mal 6 OCn-Pins 
(scheinbar die Ausgangspins von den PWMs) ausfindig gemacht und 
teilweise auch getestet (OC1A auf PB5 und OC5A auf PL3)...:
// Grundeinstellung der Timer/Counter: als nicht-invertierende 10-Bit PWMs
TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);
TCCR5A = (1<<COM5A1) | (1<<WGM51) | (1<<WGM50);
// Generierung eines Taktes von CK/1024
TCCR1B = (1<<CS12) | (1<<CS10);
TCCR5B = (1<<CS52) | (1<<CS50);
// Grundeinstellung des Signals (Top- & Compare-Wert):
// ICRn = Pulsbreite; OCRnx = Restdauer (jeweils in Relation zur Taktlänge)
ICR1 = 512; OCR1A = 512;
ICR5 = 512; OCR5A = 512;
... aber wo sind dann die anderen (mind.) 6 Kanäle/Pins, wenn es doch 
ganze 12 16-Bit-Kanäle gibt?
Ich muß gestehen, dass das Datasheet leider ein großes Mysterium für 
mich ist, da mein Englisch einfach misserabel ist.

LG, Marcel

Ps.: Zudem würde ich gerne wissen, wie man z.B. folgendes richtig 
schreiben könnte:
//orig.:
TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);
//neu: (wobei nPWM eine Variable mit der jeweiligen PWM-Nr. sein soll, um den Programmauflauf etwas übersichtlicher zu gestalten)
TCCR & nPWM & A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);
"Help me, please!";-)))))

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich hab´ nun zwar nach ein paar Stunden zumindest mal 6 OCn-Pins
>(scheinbar die Ausgangspins von den PWMs) ausfindig gemacht und
>teilweise auch getestet (OC1A auf PB5 und OC5A auf PL3)...:

Dafür brauchst du Stunden?

OC1A/B/C  Pin24/25/26
OC3A/B/C  Pin5/6/7
OC4A/B/C  Pin15/16/17
OC5A/B/C  Pin38/39/40

OC0A/B    Pin26/1
OC2A/B    Pin23/18

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Spess,

... mein Thread-Titel ist Programm! Ich bin ein absoluter Neuling, dem 
noch dazu ein deutsches Datenblatt als Grundlage für sein Vorhaben 
fehlt...;-))

Hehe, thx... aber ich hab mich wohl etwas verquer ausgedrückt. Die Pins 
weiß ich, nur den Zugriff darauf nicht. Momentan kann ich ausschließlich 
auf OCnA (wobei n = 1,3,4,5) zugreifen, da ich die im Tutorial 
gefundenen Registerzuweisungen von OC1A...
TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);
TCCR1B = (1<<CS12) | (1<<CS10);
ICR1 = 512; OCR1A = 512;
... auch auf die anderen drei übertragen kann.
Z.B. fehlt mir bei OC0A das Register ICRn, weswegen ich ständig 
Fehlermeldungen bekomme. Und bei dem Versuch zu OC1B passiert gleich 
überhaupt nichts.
WAS mach ich denn falsch, an WELCHER Stelle steh´ ich auf dem 
Schlauch???;-))

LG, Marcel

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... niemand einen Rat?

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Jeder 16-Bit-Timer hat drei OC-Register. Und mit jedem kannst du eine 
PWM erzeugen.

>Momentan kann ich ausschließlich
>auf OCnA (wobei n = 1,3,4,5) zugreifen, da ich die im Tutorial
>gefundenen Registerzuweisungen von OC1A...

>TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);
>TCCR1B = (1<<CS12) | (1<<CS10);
>ICR1 = 512; OCR1A = 512;

>... auch auf die anderen drei übertragen kann.

Dann nimm dir das Datenblatt und suche dir die passenden Bits für die 
anderen beiden PWM-Kanäle der Timer. Die Einstellungen für PWM-Mode und 
Frequenz gelten für alle Kanäle eines Timers. Die COM-Bits und das 
OC-Register jeweils für einen Kanal.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallihallöchen,;-)

... ich glaub´s ja ned... ich könnt´dich küssen!;-))))))

Es geht,... Mensch, woher soll man(n) denn SOWAS wissen? ICH kann das 
Datenblatt doch kaum entziffern... :(
Jetzt klappt´s, bis auf den 8Bit-Timer "2"...
void startPWM() {
  // Grundeinstellung der Timer/Counter: als nicht-invertierende 10-Bit PWMs:
  // COMnxn = Ausgabeart des PWM-Signals (pro PWM-Kanal)
  // WGMnn = Pulsweiten-Modulatorbits, um den PWM-Modus zu aktivieren (pro Timer)
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1C1) | (1<<WGM11) | (1<<WGM10);
  TCCR2A = (1<<COM2A1) | (1<<WGM21) | (1<<WGM20);
  TCCR5A = (1<<COM5A1) | (1<<WGM51) | (1<<WGM50);

  // Generierung eines Taktes von CK/1024
  TCCR1B = (1<<CS12) | (1<<CS10);
  TCCR2B = (1<<CS22) | (1<<CS21) | (1<<CS20);
  TCCR5B = (1<<CS52) | (1<<CS50);

  // Grundeinstellung des Top- & Compare-Wertes (jeweils in Relation zur Taktlänge):
  // ICRn/OCRnx = Pulsbreite (pro PWM-Kanal);
  // OCRnA = LOW-Periode (pro Timer)
  OCR1A = 512; ICR1 = 512; OCR1B = 512; OCR1C = 512;
  OCR2A = 512; OCR2B = 512;
  OCR5A = 512; ICR5 = 512;
}
... wo ist denn da noch der Fehler?

LG, Marcel

Autor: Datenblatt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht ist das nix für dich, wenn du das Datenblatt nicht lesen bzw. 
entziffern kannst. Du solltest dann mit einfachen Sachen anfangen und 
nicht gleich mit Timer.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Jetzt klappt´s, bis auf den 8Bit-Timer "2"...

Was klappt da nicht? Die Möglichkeiten von Timer2 findest du in Tabelle 
94.

Mit einem festen Top-Wert von $FF hast du 2 PWM-Kanäle. Ein variabler 
Top-Wert lässt sich nur mit OCR2A realisieren. Dadurch hast du für PWM 
nur noch Kanal B zur Verfügung. ICR gibt es bei diesem Timer nicht. Bei 
AVRs , wie dem ATMega2560 hilft dir das Tutorial nur bedingt. Da ist das 
Datenblatt angesagt. Na ja, das ist eigentlich immer angesagt.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Spess,

... ich versteh´s einfach ned. Noch dazu: Tabelle 94 gibt´s bei mir 
ned^^. Seit einer Stunde bastle ich nun rum, aber ich kappier´ die 
Beschreibungen zu den Tabellenangaben leider nur sehr gebrochen. Kannst 
du mir nochmal auf die Sprünge helfen? Was stimmt denn an meinen 
Einstellungen nicht?

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Jetzt erzähle erst mal genau, was nicht hinhaut.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,

... na, ich versteh einfach ned, wie ich das PWM-Signal auf den Ausgang 
OC2A o. z.B. OC0B bekomme. Irgendwann mal hatte ich mal eine 
Einstellung, sodass OC2A zumindest durchgehend HIGH war, aber weiter 
gings dann auch ned. Oben zu sehen, ist mein bislang letzter Versuch, es 
irgendwie zu schaffen.

LG, Marcel

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spess???

LG

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Poste mal dein Programm, in dem du versuchst OC2A oder OC0B zu 
aktivieren.
Ich bin notorischer Assemblerprogrammierer und kann nicht so einfach 
C-Code aus dem Ärmel schütteln. Lesen geht halbwegs. Da sehe ich eher, 
wo es klemmt.

MfG spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, du;-))

... das Programm ist doch schon in diesem Thread vorhanden. Im ersten 
Beitrag. Und der Teil, in dem ich versuche, auf die PWM-Ausgänge 
zuzugreifen, steht schon etwa zwei Seiten weiter oben:
TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1C1) | (1<<WGM11) | (1<<WGM10);
TCCR2A = (1<<COM2A1) | (1<<WGM21) | (1<<WGM20);
TCCR5A = (1<<COM5A1) | (1<<WGM51) | (1<<WGM50);

// Generierung eines Taktes von CK/1024
TCCR1B = (1<<CS12) | (1<<CS10);
TCCR2B = (1<<CS22) | (1<<CS21) | (1<<CS20);
TCCR5B = (1<<CS52) | (1<<CS50);

// Grundeinstellung des Top- & Compare-Wertes (jeweils in Relation zur Taktlänge):
// ICRn/OCRnx = Pulsbreite (pro PWM-Kanal);
// OCRnA = LOW-Periode (pro Timer)
OCR1A = 512; ICR1 = 512; OCR1B = 512; OCR1C = 512;
OCR2A = 512; OCR2B = 512;
OCR5A = 512; ICR5 = 512;

... jeweils in der zweiten Zeile, je Absatz, stehen die Zuweisungen für 
die PWM von Timer 2.

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>OCR2A = 512; OCR2B = 512;

Das ist ein 8-Bit-Timer . Also kannst du nur 0...255 zuweisen. Auch 
bei Copy&Paste muss man denken.

Wenn du OC2B benutzen willst, dann fehlen die Zuweisungen für 
COM2B1/COM2B0 und OCR2B.

>OCR1A = 512; ICR1 = 512; OCR1B = 512; OCR1C = 512;

Du hast Timer-Mode 3 gewählt. Da ist ICR1 irrelevant.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Spess,

hab´s jetzt mal so abgeändert (Auszug):
void startPWM() {

  TCCR2A = (1<<COM2A1) | (1<<WGM21) | (1<<WGM20);

  TCCR2B = (1<<CS22);

  OCR2A = 127;
}

Der Ausgang wird nun zwar geschaltet, aber ausschließlich durchgehend 
HIGH.:(

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Der Ausgang wird nun zwar geschaltet, aber ausschließlich durchgehend
>HIGH.:(

Sieht aber eigentlich richtig aus. Du misst auch an PB5?

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallöchen Spess;-)

... nö, OC2A liegt doch auf PB4.;-)
Hm... messen tu ich gar nix, grad keine Möglichkeit. Ich seh nur, dass 
meine LED durchgehend leuchtet.
Na wenn DU schon keinen Fehler sehen kannst, wie soll ICH denn da erst 
weiterkommen?;-)

LG, Marcel

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

Bewertung
0 lesenswert
nicht lesenswert
Marci schrieb:

> Na wenn DU schon keinen Fehler sehen kannst, wie soll ICH denn da erst
> weiterkommen?;-)

Mit dem naheliegensten:
Kompletten Programmcode zeigen

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz,

#define F_CPU 16000000

// Einbindung von benötigten Header-Dateien für:
#include <stdint.h> // standardisierte Datentypen
#include <avr/io.h> // Registernamen
//#include <util/delay.h>

// Variablendeklarationen
uint8_t btn1;
uint8_t btn2;
uint8_t btn3;
uint8_t btnJoyL;
uint8_t btnJoyR;
uint8_t btnJoyU;
uint8_t btnJoyD;
uint8_t btnJoyX;

uint8_t val_PWM;

void startPWM() {
  // Grundeinstellung der Timer/Counter: als nicht-invertierende 10-Bit PWMs:
  // COMnxn = Ausgabeart des PWM-Signals (pro PWM-Kanal)
  // WGMnn = Pulsweiten-Modulatorbits, um den PWM-Modus zu aktivieren (pro Timer)
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1C1) | (1<<WGM12) | (1<<WGM11) | (1<<WGM10);
  TCCR5A = (1<<COM5A1) | (1<<COM5B1) | (1<<WGM52)  | (1<<WGM51) | (1<<WGM50);

  TCCR2A = (1<<COM2A1) | (1<<WGM21)  | (1<<WGM20);

  // Generierung eines Taktes von CK/1024
  TCCR1B = (1<<CS12) | (1<<CS10);
  TCCR5B = (1<<CS52) | (1<<CS50);

  TCCR2B = (1<<CS22) | (1<<CS21) | (1<<CS20); //(1<<CS22) | 

  // Einstellung des Top- & Compare-Wertes (jeweils in Relation zur Taktlänge):
  // OCRnx = Pulsbreite (pro PWM-Kanal);
  OCR1A = 512; OCR1B = 512; OCR1C = 512;
  OCR5A = 512; OCR5B = 512;

  OCR2A = 200;
}

void stopPWM() {
  TCCR1B = 0x00;
  TCCR5B = 0x00;
}

int main(void) {
  // alle Anschlüsse der jeweiligen Ports als Ausgänge/Eingänge einstellen
  DDRB = 0xff;
  DDRL = 0xff;

  DDRK = 0x00;

  // die Werte der Ausgänge festlegen ("0" bzw. "1"; s.a. http://www.mikrocontroller.net/articles/Bitmanipulation)
  PORTL = 0x00;

  // PullUp-Festlegung der Eingänge (Taster)
  PORTK = 0xff;

  val_PWM = 0;

  while(1) {

    // Variablenzuweisungen...
    btn1 = PINK & 0b00000001;
    btn2 = PINK & 0b00000010;
    btn3 = PINK & 0b00000100;
    btnJoyL = PINK & 0b00010000;
    btnJoyR = PINK & 0b01000000;
    btnJoyU = PINK & 0b00001000;
    btnJoyD = PINK & 0b00100000;
    btnJoyX = PINK & 0b10000000;

    // ... und anschließende Abfrage der Taster-Zustände
    if (btn1 == 0) {

      PORTL = 0x00;
      PORTL |= (1<<PL7);

      PORTB = 0;
      startPWM();
    }

    else if (btn2 == 0) {
      PORTL = 0x00;
      PORTL |= (1<<PL6);

      stopPWM();
      PORTB = 0;
      PORTB |= 0b01011011; // 7-Seg.-LED: "2" anzeigen
    }

    else if (btn3 == 0) {
      PORTL = 0x00;
      PORTL |= (1<<PL5);

      PORTB = 0;
      stopPWM();
    }

    
    else if (btnJoyL == 0) {
      
    }
    else if (btnJoyR == 0) {
      
    }
    else if (btnJoyU == 0) {
      
    }
    else if (btnJoyD == 0) {
      
    }
    else if (btnJoyX == 0) {
      
    }
  }

  return 0;
}

Alle PWMs der Timer 1, 3, 4 und 5 bekomm ich so zum Laufen, außer die 
von Timer 2 (analog dazu auch Timer 0) - und ich weiß einfach nicht, 
WIE.

Help me, please!;-))

LG, Marcel

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ps.: Aber der restliche ist eigentlich nicht wichtig, es geht ja 
ausschließlich um die drei Zeilen des letzten Beitrags.

LG

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

Bewertung
0 lesenswert
nicht lesenswert
Marci schrieb:

> von Timer 2 (analog dazu auch Timer 0) - und ich weiß einfach nicht,
> WIE.

Sieht soweit eigentlich richtig aus.
Allerdings: was erwartest du bei einem PWM Wert von 200? Bei einer 8-Bit 
PWM schenkt sich das nicht viel bei einer LED. Die leuchtet mit 200 fast 
genauso hell, wie bei einem Pin der auf 1 ist.


(In deiner Stop Routine wird der Timer 2 nicht gestoppt. Ist das 
Absicht?)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Schnell mal getestet. Mit
     ldi r16,1<<COM0A1|1<<WGM01|1<<WGM00 
     out TCCR0A,r16

     ldi r16,1<<CS02
     out TCCR0B,r16

     ldi r16,$A0
     out OCR0A,r16
für Timer0 und das gleiche für Timer2 erscheint, wie erwartet, eine PWM 
an den entsprechenden Pins (ATMega1281). Also, an der Initialisierung 
liegt es nicht.
Hast du vielleicht irgend welche Jumper/Schalter auf dem Board, die den 
Port abtrennen?

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich geb´s auf.

LG

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Upps,... gar nicht gesehen, dass schon darauf geantwortet wurde.;-)

LG

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz:

1. Wenn ich den Wert weiter runter setze, verdunkelt sich die LED, 
sprich: der Wert ändert zwar das Verhalten der LED, aber sie leuchtet 
durchgehend.

2. Mein Gedanke mit den zwei 8Bit-Timern ist etwas weiter, als die 
Stop-Routine.;-) (also schon so beabsichtigt)

@Spess:

Ich habe am myAVR-Board seit der Auslieferung nichts verändert. Alle 
angeschlossenen und auch in meinem Quelltext angesprochenen Aktoren sind 
voll funktionsfähig. Der Beweis: sämtliche andere (in meinem bisherigen 
Code benutzte) PWMs laufen über PORTB (wie z.B. auch OC2A/Timer 2!) - 
und funktionieren.

Hm... und nun???;-)

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>1. Wenn ich den Wert weiter runter setze, verdunkelt sich die LED,
>sprich: der Wert ändert zwar das Verhalten der LED, aber sie leuchtet
>durchgehend.

Und was erwartest du? Blinken? Das ist ein 8-Bit-Timer. Bei 16MHz kommst 
du auf eine minimale PWM-Frequenz von 61Hz.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Spess,;-)

... ich glaub´, jetzt hat´s gefunkt. Dann geht´s ja doch schon.^^
Herzlichsten Dank!

LG, Marcel

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach... tschuldige, ich brauch dochn noch mal kurz Hilfe^^. Es gibt 
nämlich ein kleines Problem in meiner Schaltung: Ab und an schalten bei 
Taster 2 bzw. 3 die anderen Ausgänge von PORTB durch und bleiben dann 
auch über mehrere Schaltvorgänge in diesem Zustand. Gibt´s dafür 
irgendeine Erklärung?
Außer PB4,5,6 und PB7 sollten ja eigentlich alle Ausgänge auf 0 sein?

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Dazu müsste erst mal das Board genau kennen.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm... eigentlich nicht, oder?!?
Grundlegend sind ja alle PORTs, bis auf B, in meiner Schaltung erst 
einmal unbenutzt. Es kann doch dann nur an folgender Anweisung liegen?:
//Zuweisung auf Taster 2 u. 3
PORTB = 0;

??
Wenn ich obige Aktion auskommentiere, läuft ja alles wie gewünscht (aber 
die LEDs gehen dann zu meinem Bedauern auch nicht aus^^).

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>//Zuweisung auf Taster 2 u. 3
>PORTB = 0;

>Wenn ich obige Aktion auskommentiere, läuft ja alles wie gewünscht (aber
>die LEDs gehen dann zu meinem Bedauern auch nicht aus^^).

Mal eine Dumme Frage: Was willst du einem Taster zuweisen? Die Pins 
der Taster müssten eigentlich als Eingang konfiguriert sein. Und da 
wirkt sich Port=yxz nur auf die internen Pull-Up-Widerstände aus.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsch ausgedrückt..., wie man im ProgrammCode oben sieht, meinte ich 
mit "Zuweisung auf Taster 2 u. 3", die Aktion, die ausgeführt wird, wenn 
Taster 2 bzw. 3 gedrückt wird: also "PORTB = 0", um PORTB (die 
7Seg.-Anzeige) zu "leeren".

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Und welche geht/gehen nicht aus?

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PB5,6 u. 7 (OC1A,OC1B u. OC1C).
Da ich ja die PWMs nur durch ein "Timer>Stop" deaktiviere, und im 
ungünstigen Fall, gerade bei den durchgeschalteten Pins gestoppt wird.

LG, Marcel

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Es ist sinnvoller die Timer durch löschen der COM-Bits vom Port zu 
trennen. Dann kommt das Port-Register wieder zum tragen.

MfG Spess

Autor: Marci (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klingt gut, danke.;-)

LG, Marcel

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.