www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik kann mal jemand bitte einen kleinen Blick drauf werfen Fehlerverhalten


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

bin Anfänger und hoffe, dass mir jemand hilft.

Wollte ein wenig mit PWM mich beschäftigen -  nur habe anscheinend einen 
Fehler drin  -  die Frequenz soll größer und kleiner werden  -  das 
funktioniert auch  - allerdings gibt es immer wieder "Aussetzer" 
(Ausgang dann auf low)  und ich weiß nicht warum
#include <stdint.h>
#include <avr/io.h>


int main()
 { 
 
uint16_t test,test2;
uint16_t t2;

DDRB=0b00000110;
 
TCCR1A = (1<<COM1A1) | (1<<WGM11);
  TCCR1B = (1<<WGM13) | (1<<WGM12) |  (1<<CS12);




start:


t2=600;
test2=0;



while(test2<600){
 test2++;
 while (test<1000){test++;};
  test=0;
 
  t2++;

  OCR1A=(t2 / 2);
  ICR1=t2;
}

test2=0;

while(test2<600){
 test2++;
 while (test<1000){test++;};
  test=0;
  t2--;

  OCR1A=(t2 / 2);
  ICR1=t2;
}




goto start;
return 0;
}

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Sollte nicht irgendwo der Controller vereinbart sein?.
Wenn die PWN längere Zeit den Pegel nicht wechselt, ist das OC-Register 
in dieser Zeit entweder 0 oder Maximum (255 oder 65535, je nach Timer).

MfG Spess

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nein nein  -  das läuft, ja alles  -  nur es setzt so im ca 1 
Sekundentakt für ne halbe Sekunde aus ....

bitte helft mir -  ist der Code richtig ?

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist die Funktion von ICR1 (input-capture)?
Wieso beschreibst du dieses Register?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

1) ich vermute es liegt daran, dass wenn ein Zyklus durchgelaufen ist 
wieder mit goto start; an den Anfang gesprungen wird und bevor
OCR1A=(t2 / 2);
ICR1=t2;

gesetzt wird erst einmal wieder gewartet wird:
while(test2<600){
 test2++;
 while (test<1000){test++;};

2) Schau dir for-Schleifen einmal an, dann wird dein Code lesbarer und 
lass das goto weg; verwende stattdessen eine Endlosschleife.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Ich
>Wenn die PWM längere Zeit den Pegel nicht wechselt....

Du
> nur es setzt so im ca 1 Sekundentakt für ne halbe Sekunde aus ....

Worin siehst du da einen Unterschied?

Was mir noch aufgefallen ist:

uint16_t t2;
...
OCR1A=(t2 / 2);

OCR1A ist ein 8-Bit-Register

Ich weiss nicht, was C bei t2/2 > 255 macht?

MfG Spess

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich weiss nicht, was C bei t2/2 > 255 macht?

Meineswissens wird dann einfach das Low-byte genommen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

habe das Problem viel enger fassen können:


Es kommen ca im 1 Sekundentakt "Aussetzer"
int main()
 { 
 
uint16_t a,b;

DDRB=0b00000110;
 
TCCR1A = (1<<COM1A1) | (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<WGM12) |  (1<<CS12);
OCR1A=1;





while(1){

 ICR1=400;
 for(a=0; a<10; a++){};
 ICR1++;
}


}


Sobald ich ICR++ ausklammere geht es  -  warum ???

vielen Dank für eure Hilfe !

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..auch jetzt noch

int main()
 { 
 
DDRB=0b00000110;
 
TCCR1A = (1<<COM1A1) | (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<WGM12) |  (1<<CS12);
OCR1A=1;



while(1){
 ICR1=400;
 ICR1++;
}

}




Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darf man ICR1 nicht so oft beschreiben ?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Thilo -  ich will die Frequenz des PWM-Generators ändern  -  geht das 
auch anders ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wenn der Controller anscheinend geheim ist, dann verrate wenigstens ob 
du einen 8-Bit oder 16-Bit-Timer benutzt.

MfG Spess

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi  -  nix geheim   ATMEGA8


sorry !

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Und weiter. Könntest du mal Fragen vollständig beantworten. Du kannst 
keine Hilfe erwarten, wenn man dir alles aus der Nase ziehen muss.

MfG Spess

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Spess


Was meinst Du mit weiter ?


Atmega8  -  korrekt angeschlossen bei 5V  - interner Oszillator verwandt

Programmiert über AVR-Studio, hex-file über Ponyprog hochgeladen ( ging 
bisher auch immer korrekt)


Was kann ich noch mehr sagen ?



Alle Software-Einstellungen sieht man hier:


int main()
 { 
 
DDRB=0b00000110;
 
TCCR1A = (1<<COM1A1) | (1<<WGM11);
TCCR1B = (1<<WGM13) | (1<<WGM12) |  (1<<CS12);
OCR1A=1;



while(1){
 ICR1=400;
 ICR1++;
}

}






Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Alle Software-Einstellungen sieht man hier:...

1.Man kann z.B. keine Einstellungen überprüfen, wenn man nicht weiß, was 
damit erreicht werden soll ->Kommentare.

2. Ich hatte nach Timertyp gefragt. Soll ich oder andere erst im 
Datenblatt nachsehen, was du meinst?

MfG Spess

Autor: t.b.d. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...
 ICR1=400;
 for(a=0; a<10; a++){};
 ICR1++;
 ...
wenn zum Zeitpunt ICR1=410 --> ICR1=400 gilt 400<TCNT1 dann ist die 
Bedingung für das Schalten des PWM-Ports (TCNT1==ICR1) erst nach einem 
kompletten Timerdurchlauf erfüllt.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
t.b.d. .... du bist ein Schatz ;)  -  1000 DANK !

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:
> @ Thilo -  ich will die Frequenz des PWM-Generators ändern  -  geht das
> auch anders ?

Ja, durch verändern von OCR1A.

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Statt
for(a=0; a<10; a++){};

besser die Routinen aus <avr/delay.h> verwenden. Z.B. _delay_us(10);

Einige Compiler optimieren Schleifen ohne erkennbare Funktionen einfach 
weg.

Autor: LÖW (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ja, durch verändern von OCR1A."

Quark  -  das damit wird nur der Zeitpunkt des H->L  bzw. L->H 
gewechselt   -  Frequenz bleibt gleich !


Gruß Walter

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt. Hatte Frequenz mit Tastverhältnis verwechselt. ;)

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.