Forum: Mikrocontroller und Digitale Elektronik Schieberegister mit Atmega88 unter Verwendung von AtmelStudio und mySmartUSBlite ansteuern


von Lucas P. (l_p)


Lesenswert?

Verwendet wird ein ATmega 88 MikroController der Firma Atmel.
Dieser wurde mit Hilfe des mySmartUSB-lite ISP-Programmers beschireben.
Das Beschreiben des MikroControllers funktionier einwandfrei.
Der unten stehende Text wurde in den Controller geladen.
Der MikroController besitzt eine externe Spannungsversorgung (nicht über 
USB)

Code:
______________________________________________________________________
//Bibliotheken laden:
#define F_CPU 8000000
#include <avr/io.h>
#include <avr/delay.h>

//Pinmethoden definieren:
#define pin_ein(PORTx,pin) ((PORTx) |= (1<<pin))
#define pin_aus(PORTx,pin) ((PORTx) &= ~(1<<pin))
#define pin_toggeln(PORTx,pin) ((PORTx) ^= (1<<pin))
#define pin_lesen(PINx,pin) ((PINx) & (1<<pin))

int main(void)
{
  //Parameterliste:
  unsigned int i;
  unsigned int j;

  //Ausgänge definiernen:
  DDRC |= ((1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5));
  // PC5 = Reset ;
  // PC1= Serieller Eingang ;
  // PC2 = Ausgangssteuerung ;
  // PC3 = Speichertakt ;
  // PC4 = Schiebetakt ;

        while (1)
  {
  for(i = 0 ; i < 9; i++)
  {
  pin_ein(PORTC,PC2);    //Ausgänge deaktivieren.
  pin_aus(PORTC,PC5);    //RESET beginnen
  pin_ein(PORTC,PC5);    //RESET beenden
  pin_ein(PORTC,PC1);    //Seriellen Eingang auf Eins
  for (j=0;j<=i;j++)
  {
       pin_ein(PORTC,PC4);  //Schiebetakt aktivieren
             pin_aus(PORTC,PC4);  //Schiebetakt reserten
       pin_aus(PORTC,PC1);        //Seriellen Eingang auf dig. Null
  }
  pin_ein(PORTC,PC3);    //Speichertakt aktivieren.
        pin_aus(PORTC,PC3);    //speichern.
        pin_aus(PORTC,PC2);    //Ausgänge reaktivieren.
  }
  }
}
______________________________________________________________________ 
_

Ziel:
An dem Schieberegister ist an jedem der acht Ausgänge eine LED mit 
entsprechenden Vorwiderstand angebracht. Der MikroController soll diese 
8 LEDs nacheinander ein- und wieder ausschalten, und dies in einer 
Endlosschleife.

Problem:
Wenn ich das Programm auf den MikroController lade leuchten kurz alle 
LEDs auf. Ist das Programm auf den Flash-Speicher geladen, leuchtet 
jedoch keine LED und die Steueranschlüsse des Schaltregisters sind 
entsprechend des oben angeführten Quellcodes beschalten.

Frage: Kann es sein, dass das Schaltregister die positiven Flanken an 
den Steueranschlüssen nicht wahrnimmt? Bzw. habe ich etwas in der 
Programmierung falschgemacht?

Wäre für jede Hilfe sehr dankbar.
Vielen Dank im Voraus

: Verschoben durch Moderator
von Dumpfbacke (Gast)


Lesenswert?

Lucas P. schrieb:
> Verwendet wird ein ATmega 88 MikroController der Firma Atmel.

Lucas P. schrieb:
> Der unten stehende Text wurde in den Controller geladen.

Warum schreibst du in der "dritten Person"? Ist noch jemand
beteiligt? Oder traust du dir nicht zu sagen dass du derjenige
bist der das tut oder getan hat?

Oder bist du aus adeligem Haus wo nur in der dritten Person
gesprochen wird?

Vielleicht ist die andere Person dein zweites Ich.

von Dumpfbacke (Gast)


Lesenswert?

Lucas P. schrieb:
> //Bibliotheken laden:

Das sind keine Bibliotheken sondern Header Files

Lucas P. schrieb:
> //Pinmethoden definieren:

Das sind keine Pinmethoden sondern Makros

Lucas P. schrieb:
> //Parameterliste:

Das sind keine Parameter sondern Variablen

Lucas P. schrieb:
> Schieberegister mit Atmega88

Schaltpläne in Prosa sind scheisse. Du gibst nicht einmal
an welches Schieberegister du verwendest.

Zeige einen vollständigen Schaltplan.

von fop (Gast)


Lesenswert?

Das Ganze läuft in einer affenartigen Geschwindigkeit durch. Dabei sind 
die Ausgänge die meiste Zeit deaktiviert.

Wenn man von 0...8 zählt, zählt man 9 Mal.
1
> for (i = 0 ; i < 9; i++)

von Lucas Pelchen (Gast)


Lesenswert?

@ fop: vielen dank. Das habe ich vermutet, wie verringere ich die 
Geschwindigkeit des Ablaufs?
Außer mit _delay_ms() zu arbeiten.
Theoretisch könnte ich die F_CPU verringern, ist dies unbegrenzt 
möglich?

von Stefan F. (Gast)


Lesenswert?

Standardmäßig takten alle AVR's mit 1 oder 1,2 Mhz was für die üblichen 
Schieberegister in Ordnung ist.

Statt _delay_ms() kannst duch auch _delay_us() benutzen oder für sehr 
kurze Verzögerungen den Assembler Befehl "NOP" einbetten (das ist aber 
nicht ganz so einfach).

Aber es geht hier ja nicht nur um die Frequenz, die das Schieberegister 
"schafft", sondern auch um deine Augen. Das ganz muss ja langsam genug 
ablaufen, damit man auch etwas sehen kann.

> Theoretisch könnte ich die F_CPU verringern, ist dies unbegrenzt möglich?

Prinzipiell ja, aber vermutlich nicht so, wie Du es Dir gerade 
vorstellst.

F_CPU verändert nicht die Taktfrequenz sondern muss der Taktfrequenz 
entsprechen, damit die _delay_xx() Funktionen tun, was sie sollen. Wenn 
du die CKDIV8 Fuse nicht verändert hast, läuft dein Controller mit 1Mhz, 
nicht mit 8Mhz.

Lies mal im Datenblatt die Kapitel "System Clock and Clock Option", 
sowie "Clock Prescale Register" und "Fuse Low Byte" durch.

Zeichne einen Schaltplan.

Danach melde dich nochmal.

von L_P (Gast)


Angehängte Dateien:

Lesenswert?

Anbei ist eine skizze von den beiden Bauteilen.

Warauf soll ich in den besagtenKapiteln besonders achten?

von Stefan F. (Gast)


Lesenswert?

Da fehlen Abblock-Kondensatoren.
Ich bezweifle, dass du so viele Signal-Leitungen zwischen µC und 
Schieberegister benötigst.

von L_P (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe den Aufbau entsprechend dem AVR_Tutorial gemacht. Hier sind 
auch keine Kondensatoren eingebaut. Grundsätzlich ist es doch egal 
welche Pins ich am Mikrocontroller verwende um die Steueranschlüsse am 
Schieberegister anzusteuern, oder? Ich habe mich für PC1-PC5 
entschieden. Bei diesen ist weder ein MISO , MOSI; SCK dabei, da ich 
diese schon für ISP-Programmer verwendet habe, wollte ich die 
Schieberegister der Sauberkeit halber mit einem anderen Port ansteuern.
Da ich leider kein Assembler kann, kann ich mit dem Quell-Code in der 
AVR-Anleitung leider wenig anfangen.
Da die Applikation des Schieberegisters - abgesehen von den verwendeten 
Pins - der des AVR-Tutorials entspricht, hatte ich eben den Verdacht das 
ich mit der Software einen Fehler gemacht habe.
Habe ich eventuell irgendwelche Headerdateien, etc vergessen?

von Stefan F. (Gast)


Lesenswert?

> Ich habe den Aufbau entsprechend dem AVR_Tutorial gemacht.

Mir egal, es ist falsch. Gerade Schieberegister und Mikrocontroller 
benötigen Abblock-Kondensatoren, um zuverlässig zu funktionieren.

> hatte ich eben den Verdacht das
> ich mit der Software einen Fehler gemacht habe.

Wenn du mir nicht glaubst, kannst du ja alleine weiter suchen. Du hast 
die Qual der Wahl. Ohne Abblock-Kondensatoren helfe ich Dir nicht 
weiter.

Hast du dein Programm inzwischen entsprechend unserer Ratschläge 
korrigiert? Zeitg mal, wie es jetzt aussieht.

von Abel H. (abel)


Lesenswert?

L_P schrieb:
> Ich habe den Aufbau entsprechend dem AVR_Tutorial gemacht. Hier sind
> auch keine Kondensatoren eingebaut.

Streite doch nicht, mache welche dran. Damit schließt Du schon eine 
Fehlerquelle aus. Du mußt doch nicht die Fehler wiederholen, mit denen 
schon etliche Andere auf die Schnauze gefallen sind.

Abel

von c-hater (Gast)


Lesenswert?

L_P schrieb:

> Ich habe den Aufbau entsprechend dem AVR_Tutorial gemacht. Hier sind
> auch keine Kondensatoren eingebaut.

Bei Bohrmaschinen steht auch nicht ausdrücklich in der 
Bedienungsanleitung, dass man sich damit besser nicht in den Augen 
bohrt.

Es wird einfach erwartet, dass jeder allein erkennt, was gut für ihn 
ist...

> Grundsätzlich ist es doch egal
> welche Pins ich am Mikrocontroller verwende um die Steueranschlüsse am
> Schieberegister anzusteuern, oder?

Kommt drauf an. Nicht jeder Pin ist unter jedem Aspekt mit jedem anderen 
einfach austauschbar. Im konkreten Fall (Mega88) sollte es allerdings 
keine besonderen Probleme bei der Verwendung von PC1..PC5 geben, bei den 
größeren Megas sähe das aber schon wieder anders aus.

> Da ich leider kein Assembler kann, kann ich mit dem Quell-Code in der
> AVR-Anleitung leider wenig anfangen.

Dann musst du es lernen. AVR-Assembler ist eine sehr einfache Sprache 
mit sehr simplen Regeln und einer sehr überschaubaren Vielfalt möglicher 
Anweisungen.

> Da die Applikation des Schieberegisters - abgesehen von den verwendeten
> Pins - der des AVR-Tutorials entspricht, hatte ich eben den Verdacht das
> ich mit der Software einen Fehler gemacht habe.

Entweder dort oder bei der Hardware. So einfach ist es eigentlich immer. 
Der Trick beim µC-Programmieren ist: selber herausfinden zu können, wo 
genau der Fehler steckt...

Wer das nicht kann, ist unfähig und muss einfach noch etwas mehr 
lernen...

von Stefan F. (Gast)


Lesenswert?

Hast du eigentlich einen Debugger (Dragon oder ICE)? Der wäre jetzt sehr 
hilfreich.

Wenn nicht, dann lass das Programm einfach mal im Simulator laufen und 
schaue, ob die Bits von Port C sich wirklich so verhalten, wie du es 
erwartet hast.

von L_P (Gast)


Lesenswert?

Frage1: Welche Kapazität benötigt der Abblockkondensator? Setze ich die
        Kondensatoren parallel zum Mikrocontroller und zu dem
        Schieberegister?
Frage2: Ich verwende ATMEL Studio 7 aber ich habe keine Ahnung wie ich 
den
        Simmulator benutze.

An der Software habe ich momentan noch nichts gemacht. Wollte erstmal 
abwarten was Hardwaremäßig noch alles kommt.

von Stefan F. (Gast)


Lesenswert?

Grundsatz Nummer 1: Jedes IC bekommt immer einen 100nF Kondensator 
möglichst nahe an den VCC und GND Pins des IC. Es sei denn, du hast 
einen fundierten wichtigen Grudn dagegen.

Für den Simulator gibt es bei Youtube ein Video. Oder klick dich einfach 
durch, du findest es bestimmt an einem Abend heraus. by the way: Wenn du 
den Simulator bedienen gelernt hast, kannst du auch mit einem Hardware 
Debugger umgehen. Der Unterschied ist, dass das Programm dan in der 
echten Hardware Schritt für Schritt ausgeführt wird, so daß du das 
Ergebnis direkt auf den LED's sehen kannst. Und du kannst Dir alle 
Variablen anschauen.

Ich warte noch auf deinen aktuellen Quelltext.

> Wollte erstmal abwarten was Hardwaremäßig noch alles kommt.

Was wenig Sinn macht, da ja längst klar ist, daß dein Programm grobe 
Fehler hat, vor allem fehlende Delays.

von L_P (Gast)


Lesenswert?

Die Videos habe ich gesehen und gehe gerade den Code durch.
Meine Frage zu den Delays: Momentan habe ich nur einen ca 60000 ms delay 
nach reaktivieren der Ausgänge, reicht das nicht?
sonst unverändert.

von Stefan F. (Gast)


Lesenswert?

Dein Schieberegister würde die 8Mhz locker mit machen. Du musst dur 
dafür sorgen, daß die LED's lange genug leuchten, damit es etwas zu 
sehen gibt. 60000ms ist eine ganze Minute, das kann nur ein Irrtum sein, 
oder?

Wobei mich hier so ein komische Gefühl im Nacken kitzelt. Frage: Wie 
lang darf der Delay maximal sein? Sicher gibt es Grenzen, wenn du die 
überschreitest, kommt etwas zufälliges dabei heraus. Was sagt die Doku 
zum _delay_ms() Befehl?

von Lucas P. (l_p)


Lesenswert?

//Bibliotheken laden:
#define F_CPU 8000000
#include <avr/io.h>
#include <avr/delay.h>

//Pinmethoden definieren:
#define pin_ein(PORTx,pin) ((PORTx) |= (1<<pin))
#define pin_aus(PORTx,pin) ((PORTx) &= ~(1<<pin))
#define pin_toggeln(PORTx,pin) ((PORTx) ^= (1<<pin))
#define pin_lesen(PINx,pin) ((PINx) & (1<<pin))

int main(void)
{
//Parameterliste:
unsigned int i;
unsigned int j;

//Ausgänge definiernen:
DDRC |= ((1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5));
// PC5 = Reset ;
// PC1= Serieller Eingang ;
// PC2 = Ausgangssteuerung ;
// PC3 = Speichertakt ;
// PC4 = Schiebetakt ;

while (1)
{
    for(i = 0 ; i < 8; i++)
    {
  //pin_ein(PORTC,PC2);    //Ausgänge deaktivieren.
  pin_aus(PORTC,PC2);    //Ausgänge reaktivieren.
  pin_aus(PORTC,PC5);    //RESET beginnen
        pin_ein(PORTC,PC5);    //RESET beenden
  pin_ein(PORTC,PC1);    //Seriellen Eingang auf Eins
  //for (j=0;j<=i;j++)
        //{
  pin_ein(PORTC,PC4);  //Schiebetakt aktivieren
  pin_aus(PORTC,PC4);  //Schiebetakt reserten

  //pin_aus(PORTC,PC1); //Seriellen Eingang auf dig. Null
  //}
  pin_ein(PORTC,PC3);  //Speichertakt aktivieren.
  pin_aus(PORTC,PC3);  //speichern.
  pin_aus(PORTC,PC2);  //Ausgänge reaktivieren.
  _delay_ms(60000);  //Wartezeit = 1 min
    }
    i=0;
}
}

von Stefan F. (Gast)


Lesenswert?

Rpcke das doch mal anständig ein und benutze die Tags für Quelltexte, 
damit man das auch lesen kann!
1
//Bibliotheken laden:
2
#define F_CPU 8000000
3
#include <avr/io.h>
4
#include <avr/delay.h>
5
6
//Pinmethoden definieren:
7
#define pin_ein(PORTx,pin) ((PORTx) |= (1<<pin))
8
#define pin_aus(PORTx,pin) ((PORTx) &= ~(1<<pin))
9
#define pin_toggeln(PORTx,pin) ((PORTx) ^= (1<<pin))
10
#define pin_lesen(PINx,pin) ((PINx) & (1<<pin))
11
12
int main(void)
13
{
14
    //Parameterliste:
15
    unsigned int i;
16
    unsigned int j;
17
18
    //Ausgänge definiernen:
19
    DDRC |= ((1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5));
20
    // PC5 = Reset ;
21
    // PC1= Serieller Eingang ;
22
    // PC2 = Ausgangssteuerung ;
23
    // PC3 = Speichertakt ;
24
    // PC4 = Schiebetakt ;
25
26
    while (1)
27
    {
28
        for(i = 0 ; i < 8; i++)
29
        {
30
          //pin_ein(PORTC,PC2);    //Ausgänge deaktivieren.
31
          pin_aus(PORTC,PC2);    //Ausgänge reaktivieren.
32
          pin_aus(PORTC,PC5);    //RESET beginnen
33
                pin_ein(PORTC,PC5);    //RESET beenden
34
          pin_ein(PORTC,PC1);    //Seriellen Eingang auf Eins
35
          //for (j=0;j<=i;j++)
36
          //{
37
              pin_ein(PORTC,PC4);  //Schiebetakt aktivieren
38
              pin_aus(PORTC,PC4);  //Schiebetakt reserten
39
40
              //pin_aus(PORTC,PC1); //Seriellen Eingang auf dig. Null
41
          //}
42
          pin_ein(PORTC,PC3);  //Speichertakt aktivieren.
43
          pin_aus(PORTC,PC3);  //speichern.
44
          pin_aus(PORTC,PC2);  //Ausgänge reaktivieren.
45
          _delay_ms(60000);  //Wartezeit = 1 min
46
        }
47
        i=0;
48
    }
49
}

von Stefan F. (Gast)


Lesenswert?

Was habe ich zur Delay Zeit geschrieben?

Du bekommst jetzt einen symbolischen Schlag in den Nacken von Papa!

von Lucas P. (l_p)


Lesenswert?

Die Minute war eigentlich gewollt.Wenn ich den Delay aus kommentiere, 
dann läuft das Programm ohne Probleme durch, ab einem delay von über 200 
MS steigt der Simulator aus.
Also wäre das weitere Vorgehen, den 100nF Abblockkondensatoren am 
MikroController anzubringen und dann einen Hardwaredebugging-Durchgang 
zu machen ?
Ist der Atmel Studio Debugger auch als Hardware Debugger verwendbar oder 
muss man hierzu andere Software beschaffen.

von Frank G. (frank_g53)


Lesenswert?

Lucas P. schrieb:
> for(i = 0 ; i < 8; i++)
>     {
>   //pin_ein(PORTC,PC2);    //Ausgänge deaktivieren.
>   pin_aus(PORTC,PC2);    //Ausgänge reaktivieren.
>   pin_aus(PORTC,PC5);    //RESET beginnen
>         pin_ein(PORTC,PC5);    //RESET beenden
..

Guck mal nach dem Timing und Takte, Seite 7 und 8:
http://www.ti.com/lit/ds/symlink/sn74hc595.pdf

von Stefan F. (Gast)


Lesenswert?

Den Delay kannst du nicht sinnvoll simulieren, weil der Simulator viel 
langsamer läuft, als der echte µC. Im Simulator würde ich die Delays 
auskommentieren und das Programm stattdessen Zeile für Zeile nach 
Tastendruck abarbeiten.

Nächste Schritte:
100nF Kondensatoren hinzufügen
Delay nicht länger als erlaubt machen
Sich mit dem Simulator vertraut machen
Lernen, wie das mit den FUSES geht und entweder die Fuse für den Clock 
Prescaler richtig einstellen oder die F_CPU Angabe auf 1Mhz korrigieren.

Des weiteren würde ich das Programm weiter ausdünnen, solange es nicht 
tut, was es soll. Die beiden Leitungen /OE (Ausgangsteuerung) und /MR 
(Reset) von Schieberegister würde ich ganz am Anfange des Programmes auf 
High setzen und dann nicht mehr ändern.

Beschränke deine ersten Schritte auf die Nutzung der beiden 
Taktleitungen und den seriellen Daten. Takte einfach immer abwechslend 
eine "1" und eine "0" in das Schieberegister, dann müsste jede zweite 
LED leuchten.

Und denke mal drüber nach, wozu das i=0 am Ende (nicht) gut ist.

Hardware Debugger ist ein optionaler Luxus. Dafür wirst du mindestens 50 
Euro ausgeben müssen. Lass das erstmal.

> Ist der Atmel Studio Debugger auch als Hardware Debugger verwendbar

Ja, aber du brauchst dazu ein Gerät (Atmel ICE für Atmel Studio 7, oder 
Dragon für AVR Studio 4 unter Windows XP oder Windows 7).

von Stefan F. (Gast)


Lesenswert?

Korrektur: /OE muss natürlich low sein damit die LEDs leuchten können.

von Lucstl (Gast)


Lesenswert?

Stefan U. schrieb:
> a, aber du brauchst dazu ein Gerät (Atmel ICE für Atmel Studio 7, oder
> Dragon für AVR Studio 4 unter Windows XP oder Windows 7).

Wäre das ok?
http://www.watterott.com/de/Atmel-ICE-Debugger-PCBA-only

von Stefan F. (Gast)


Lesenswert?

Ja

von spess53 (Gast)


Lesenswert?

Hi

>Wäre das ok?
>http://www.watterott.com/de/Atmel-ICE-Debugger-PCBA-only

Jain. Beachte bitte, das da keine Kabel dabei sind. Die Pfostenverbinder 
haben ein Rastermaß von 1,27 mm, also halb so groß wie üblich.

Also mach dich bei den üblichen Verdächtigen über Kabel/Steckverbinder 
schlau.

MfG Spess

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.