Forum: Mikrocontroller und Digitale Elektronik Wechsel von ATmega8 zu ATmega88 Probleme beim PWM


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sebastian L. (selucky)


Lesenswert?

Hallo zusammen,

wir haben eine Motorsteuerplatine, bei er jetzt der ATmega8 durch einen 
ATmega88 ersetzt wurde (wegen Kosten / Verfügbarkeit).

Durch den Wechsel wird ein Programmupdate notwendig sein. Von dem alten 
Program haben wir den BASCOM-Code, aber keinen BASCOM (und ich kenne 
BASCOM nicht).
Also haben wir uns überlegt, dass ganze Programm (ist ja nicht viel) in 
C zu übersetzen.

Probleme macht mir jetzt der PWM, der im Zusammenspiel mit einer 
H-Brücke einen Sanftanlauf mit Links- / Rechtslauf machen soll.

In BASCOM wurde der PWM so initialisiert:
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm 
= Clear Down , Prescale = 8
Welche Registereinstellungen macht der Befehl?

Andere Frage. Ich bekomme den PWM auf der Platine (ATmega88) nicht ans 
Laufen. Auf der Platine ist eine LED, die auch ohne angeschlossenen 
Motor grün (rechtslauf) oder rot (linkslauf) leuchtet und beim 
Einschalten (Sanftanlauf) langsam aufleuchtet. Interessanterweise 
funktioniert das gleiche auf dem ATmega8 schon.
Was ist da der Unterschied? Was fehlt da?

Folgenden Code habe ich jetzt einfach mal zum Testen geschrieben.
1
#include <avr/io.h>
2
3
#define  F_CPU      8000000UL    
4
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7
8
int main(void)
9
{
10
  unsigned int counter = 0;
11
  
12
  DDRB |= (1<<PB1); // OC1A
13
  DDRB |= (1<<PB2); // OC1B
14
  DDRB |= (1<<PB6); // H Brücke links 
15
  DDRB |= (1<<PB7); // H Brücke rechts
16
  
17
  DDRD |= (1<<PD6); // LED rot
18
  DDRD |= (1<<PD7); // LED grün
19
  
20
  PORTD  |= (1<<PD6); // rot
21
  PORTD  |= (1<<PD7); // grün
22
  
23
  PORTB  |= (1<<PB7);  // H Brücke rechts
24
  PORTB  &= ~(1<<PB6);  // H Brücke links 
25
26
/* ATmega8 */
27
  // Timer stoppen
28
  TCCR1B = 0x00; 
29
  TCCR1A = 0x00;
30
  
31
  OCR1A = 0;
32
  OCR1B = 0;
33
34
  // OC1A angeschlossen, OC1B nicht
35
  TCCR1A = (1 << COM1A1)|(0 << COM1B1)|(1 << WGM10);
36
  
37
  // Timer Start mit CLK / 8
38
  TCCR1B = (1 << WGM12)|(0 << CS12)|(1 << CS11)|(0 << CS10);
39
  
40
  // Interrupts einschalten
41
  sei();
42
  
43
    while (1) 
44
    {  
45
    while (counter < 255)
46
    {
47
      counter += 5;      
48
      OCR1A = counter;
49
      _delay_ms(25);
50
    }
51
  
52
    _delay_ms(500);
53
    
54
    while (counter > 0)
55
    {
56
      counter -= 5;
57
      OCR1A = counter;
58
      _delay_ms(25);
59
    }
60
      
61
    PORTD  &= ~(1<<PD7);
62
  
63
    _delay_ms(500);
64
    
65
    PORTD  |= (1<<PD7);
66
    
67
    _delay_ms(500);      
68
    }
69
}

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> Andere Frage

Tja - interessanterweise funktioniert das Gleiche bei mir schon, also 
das gezeigte Programm; genauer: eine LED an B1 wird langsam heller und 
dann wieder dunkler, so etwa im 4 s-Rhythmus.
  Da läuft vielleicht auf Ihrem ATmega88 das falsche Programm.

von Oliver S. (oliverso)


Lesenswert?

Sebastian L. schrieb:
> Welche Registereinstellungen macht der Befehl?

Die Frage scheint darauf hinzudeuten, daß du nicht nur Bascom nicht 
kennst, sondern auch AVRs nicht so wirklich.

Acuh wenn du Bascom nicht kennst, wäre es da doch das einfachste, die 
paar Euro für eine Lizenz auszugeben, und den Originalcode neu zu 
compilieren.

Oliver

von Sebastian L. (selucky)


Lesenswert?

AVR kenne ich schon, hab nur die PWM Funktion bisher nicht verwenden 
müssen.

Hatte mich halt gewundert warum das Programm auf dem 88er nicht 
funktioniert,  auf dem 8er jedoch schon.

Die Platine ist sonst gleich aufgebaut. Auch eine zweite Platine zeigt 
das gleiche Problem.

von Stefan F. (Gast)


Lesenswert?

Hast du den Code denn für den Atmgea88 neu compiliert? Sie sind nicht 
binär kompatibel!

Dort sind alle Unterschiede aufgelistet:
https://ww1.microchip.com/downloads/en/Appnotes/doc2553.pdf

von S. Landolt (Gast)


Lesenswert?

> Hatte mich halt gewundert warum das Programm auf dem 88er
> nicht funktioniert,  auf dem 8er jedoch schon.

Wie gesagt, das Programm läuft auf einem ATmega88 - wenn es denn für 
diesen auch neu übersetzt wurde. Siehe den Beitrag von Stefan Frings.

von Sebastian L. (selucky)


Lesenswert?

Ja, ich ändere das Device im Atmel Studio und übertrage das dann.

von Stefan F. (Gast)


Lesenswert?

Sebastian L. schrieb:
> Ja, ich ändere das Device im Atmel Studio und übertrage das dann.

Du musst es auch neu compilieren

von Sebastian L. (selucky)


Lesenswert?

Okay, dachte der macht das automatisch. Werde ich morgen mal versuchen.
Danke schon mal.

von Oliver S. (oliverso)


Lesenswert?

Sebastian L. schrieb:
> AVR kenne ich schon

Die drei Buchstaben sicherlich, die lernt man in der ersten Klasse…

Oliver

von Wie mich dieses Arschloch anödet (Gast)


Lesenswert?

Oliver S. schrieb:
> Die drei Buchstaben sicherlich, die lernt man in der ersten Klasse…

Die Buchstaben vier Buchstaben I-D-I-O-T hast Du sicher schon im 
Kindergarten kennengelernt, wenn Du von der Kindergärtnerin gerufen 
wurdest, wie?

von Sebastian L. (selucky)


Lesenswert?

Danke ;)

von Heiner (Gast)


Lesenswert?

Wie mich dieses Arschloch anödet schrieb:
> Oliver S. schrieb:
>> Die drei Buchstaben sicherlich, die lernt man in der ersten Klasse…
>
> Die vier Buchstaben I-D-I-O-T hast Du sicher schon im
> Kindergarten kennengelernt, wenn Du von der Kindergärtnerin gerufen
> wurdest, wie?

IDIOT - Sind das nicht FÜNF (!!) Buchstaben 🤔🤷‍♂️😂

Zählen ist wohl nicht so Dein Ding 😂

SCNR

von Sebastian L. (selucky)


Lesenswert?

Aber das I ist doppelt ;) also 4 Buchstaben.

von S. Landolt (Gast)


Lesenswert?

Um diesem Unsinn wenigstens etwas Positives abzugewinnen:

Das Zählregister

Das Zählregister zählt: Null, eins,
zwei, drei, vier, fünf, sechs, sieb'n und: keins;
  das macht, es zählt oktal.

Es ist beschränkt wie mancher Mann
der nur bis sieben zählen kann
  und merkt es nicht einmal.

in memoriam KLEN

------

Und falls jemanden das Original interessiert:

Das Perlhuhn

Das Perlhuhn zählt: Eins, zwei, drei, vier...
Was zählt es wohl, das gute Tier,
      dort unter den dunklen Erlen?

Es zählt, von Wissensdrang gejückt,
(die es sowohl wie uns entzückt:)
      die Anzahl seiner Perlen.

Christian Morgenstern

von Frank S. (_frank_s_)


Lesenswert?

Hallo Sebastian,

Sebastian L. schrieb:
> Von dem alten
> Program haben wir den BASCOM-Code, aber keinen BASCOM

für BASCOM gibt es einen kostenlosen Compiler bis 4 KB Quelltext.
Wenn das reichen sollte:
- BASCOM herunterladen
- BASCOM installieren
- Quelltext nach Änderung für den neuen Atmega88 compilieren
- Datei auf den neuen Atmega88 übertragen
- einschalten
- freuen!

MfG von der Spree
Frank

von InJederHinsicht (Gast)


Lesenswert?

Sebastian L. schrieb:
> Probleme macht mir jetzt der PWM

... die PWM ...
https://www.duden.de/suchen/dudenonline/%5BModulation%5D

von Sebastian L. (selucky)


Lesenswert?

Guten Morgen,

also Device Änderung und ein neues compilieren hat nichts gebracht.

Kann man dann, wenn das Programm anscheinend bei anderen funktioniert, 
davon ausgehen, dass das Programm richtig ist und irgendwas auf der 
Platine falsch ist?

von S. Landolt (Gast)


Lesenswert?

Sehe ich das richtig: Sie haben zwei Platinen vor sich, eine mit einem 
ATmega8, die andere mit einem ATmega88, die jeweils korrekte HEX-Datei 
ist geladen, und auf der ersten funktioniert dieses LED-auf&ab, auf der 
zweiten tut sich nichts?
  Also dann würde ich erstmal an beiden Platinen die Stromaufnahme sowie 
die Betriebsspannungen direkt am Controller messen und vergleichen.

von Stefan F. (Gast)


Lesenswert?

Hast du wirklich die richtige hex Datei geflasht? Die Gestaltung des 
Atmel Studio provoziert manchmal, dass man die falsche Datei flasht, 
wenn mehrere vorhanden sind.

Also lieber nochmal ganz genau hinschauen, welche Datei in dem 
Eingabefeld steht. Und kontrolliere mit dem Dateimanager den Zeitstempel 
dieser Datei. Nicht dass das doch eine alte von gestern ist.

von Werner (Gast)


Lesenswert?

Wie sieht es denn mit den Fuses aus?

Ich nehme an, im Mega8 wurden die schon richtig gesetzt.
Bei den "neuen" Platinen mit Mega88: Hast Du daran gedacht, dass die 
ggf. noch mit dem internen RC Oszillator und CLKDIV8 laufen?

Werner

von S. Landolt (Gast)


Lesenswert?

an Werner:
Dann würde das LED-auf&ab trotzdem laufen, nur eben langsamer oder 
schneller.

Aber richtig, Thema Fuses: Betriebsspannung / BOD?

von Werner (Gast)


Lesenswert?

S. Landolt schrieb:
> an Werner:
> Dann würde das LED-auf&ab trotzdem laufen, nur eben langsamer oder
> schneller.

Ja, ich weiß. Wenn dort ein 16 Mhz quarz verbaut ist und der Mega mit 1 
Mhz läuft, dann muss man auf Aktionen, die normalerweise innerhalb von 4 
Sekunden ablaufen fast eine Minute warten.
Da könnte man uf die Idee kommen, dass nichts passiert / es nicht 
funktioniert.


Werner

von S. Landolt (Gast)


Angehängte Dateien:

Lesenswert?

Also 1. meine C-Kenntnisse sind rudimentär, 2. habe ich keinen ATmega8 
zum Ausprobieren und 3. weiß ich nicht, ob es zielführend ist, trotzdem:
  beigefügtes Programm sollte eine LED an B1 blinken lassen, unabhängig 
davon, ob ATmega8 oder 88.

von S. Landolt (Gast)


Lesenswert?

an Werner:
nach dem eingangs gezeigten Programm sind 8 MHz vorgesehen, außerdem 
dimmt die LED ja auf und ab, ein solches Verhalten wird recht schnell 
erkannt.

von Heiner (Gast)


Lesenswert?

Sebastian L. schrieb:
> Aber das I ist doppelt ;) also 4 Buchstaben.

Aha! Wenn etwas mehrmals vorkommt, zählst Du es nur einmal. Echt clever, 
insbesondre bei Arrays 👍👍

Unglaublich

von Sebastian L. (selucky)


Lesenswert?

Es wird doch irgendwas auf der Platine falsch sein.

Hab jetzt auf beiden Platinen mal den OC1A Pin gemessen, dort laufen 
beide schön von 0 - 5 V hoch und runter.
Verhalten sich also gleich.

Also wird ist irgendwas auf der neuen Platine falsch sein, auch wenn 
beide Platinen gleich sein sollten.

Vielen Dank für die hilfreichen Kommentare.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.