www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MM5450 Treiber mit Atmega8


Autor: Flo Bien (bluefoxxp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich hab mir einen MM5450 (Datenblatt: 
http://www.micrel.com/_PDF/mm5450.pdf) gekauft und an meinen Atmega8 
angeschlossen:
An PB0 hängt die Clock-Leitung und an PC0 die Daten-Leitung.
Den "DATA-ENABLE"-Eingang vom MM5450 hab (da er LOW-ACTIVE ist) auf 
Masse gehängt. Die "Brightness-Control" ist über einen 
380-Ohm-Widerstand mit der Vorsorgung (9V) verbunden.
Und zum Testen habe ich mal nur 2 LEDs und zwar an OUTPUT BIT 1 und 2 
des MM5450 über 330-Ohm-Widerstände an 5V-Versorgung angeschlossen.

Mein C Code:
#include <avr\io.h>
#include <avr\interrupt.h>       
#include <avr\signal.h>          

int n=8;
unsigned char z[9]={0,0,0,0,0,0,0,1,1};   // 8 Daten + 1 Startbit (1er)

// Timer0 Interrupt:
ISR(TIMER0_OVF_vect) {    //T0-Overflow ruft IR auf

if(PB0==0 && n>=0) //d.h. als nächstes kommt eine positive Flanke
{
 PORTC=z[n];  //Daten
 n--;  
}
else
 PORTC=z[0]; //nach 36 Datenbits startet Schieberegister im MM5450

PORTB ^= (1<<PB0); //CLOCK

}

int main(void) {
   DDRB = 0xFF;
   PORTB=0x00;
   DDRC = 0xFF;
   sei(); //Interrupts global enable
   TCCR0=0x01; //Prescaler /1
   TIMSK=0x01; //T0-Interrupt
   while(1) {                 
   }
}

Leider funktioniert aber gar nichts. Die LEDs leuchten einfach nur vor 
sich hin :-(
Was habe ich falsch gemacht?

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Laß dochmal den ganzen Interruptquatsch sein und schreib ne einfache 
Ausgabefunktion.

Anbei mal ein Beispiel für 2  4  7-Segmentanzeigen.
Je ein Treiber-IC steuert 4 Anzeigen und beide ICs sind parallel (Daten 
und Clock vertauscht).
Das geht, da ja erst auf ein Startbit gewartet wird.
D.h. wenn ein IC angesteuert wird, schiebt der andere nur Nullen rein.

Zu Anfang sende ich erstmal 36 Nullbits, damit der Treiber in nem 
definierten Zustand ist.


Peter

Autor: Flo Bien (bluefoxxp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie funktioniert dein Code? - Ich sehe hier keine main-Funktion.

Stimmt meine Verdrahtung, wie ich sie oben beschrieben habe?

Autor: Flo Bien (bluefoxxp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe meinen Code jetzt ohne Interrupts geschrieben. Kann mir jemand 
sagen, ob das so stimmt?
Ich möchte nur die LED am ersten Pin einschalten.

#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>

int n=36;
unsigned char z[36]={0x00,0x00,0x00,0x00,
              0x00,0x00,0x00,0x00,
              0x00,0x00,0x00,0x00,
              0x00,0x00,0x00,0x00,
              0x00,0x00,0x00,0x00,
              0x00,0x00,0x00,0x00,
              0x00,0x00,0x00,0x00,
              0x00,0x00,0x00,0x00,
              0x00,0x00,0x01,0x01};

void my_function(void) {

   do
   {
     PORTB=0x00;
     PORTC=z[n];
     PORTB=0x01;
     n--;
   }while(n>=0);
  
}

// ***********************************************************
// Main program
//
int main(void) {

   while(1) {
      my_function();
   }

}

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
n wird nur einmal auf 36 gesetzt, nach einmaligem Durchlauf der Funktion 
ist es 0

Autor: Flo Bien (bluefoxxp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das habe ich mittlerweile schon behoben. hatte aber leider keinen effekt 
:-(

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst noch die DDRD Register beschreiben, sonst sind alle Pins 
Eingang

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe grad im Datenblatt, der MM5450 ist ja schnarchlahm.
Beim 8051 war das noch nicht kritisch.
Welchen Takt hast Du denn?

Probier mal das hier:

#define F_CPU   16e6            // 16MHz

#include <avr/io.h>
#include <util/delay.h>

//                      Access bits like variables:
struct bits {
  uint8_t b0:1;
  uint8_t b1:1;
  uint8_t b2:1;
  uint8_t b3:1;
  uint8_t b4:1;
  uint8_t b5:1;
  uint8_t b6:1;
  uint8_t b7:1;
} __attribute__((__packed__));

#define SBIT_(port,pin) ((*(volatile struct bits*)&port).b##pin)
#define SBIT(x,y)       SBIT_(x,y)


#define DAT             SBIT( PORTC, PC0 )
#define DAT_DDR         SBIT( DDRC,  PC0 )
#define CLK             SBIT( PORTB, PB0 )
#define CLK_DDR         SBIT( DDRB,  PB0 )


void mm5450_wr( uint8_t num, uint8_t val )
{
  do{
    CLK = 0;
    DAT = 0;
    if( val & 0x01 )            // LSB zuerst
      DAT = 1;
    val >>= 1;
    _delay_us( 1 );             // MM5450 ist schnarchlahm (0,5MHz)
    CLK = 1;
    _delay_us( 1 );             // MM5450 ist schnarchlahm (0,5MHz)
  }while( --num );
    CLK = 0;
}

int main( void )
{
  CLK_DDR = 1;
  DAT_DDR = 1;
  mm5450_wr( 35, 0 );           // bringe MM5450 in definierten Anfangszustand

  for(;;){
    mm5450_wr( 1, 1 );          // startbit
    mm5450_wr( 8, 0xFF );       // Bit 1..8 = ein
    mm5450_wr( 8, 0xFF );       // Bit 9..16 = ein
    mm5450_wr( 8, 0xFF );       // Bit 17..24 = ein
    mm5450_wr( 8, 0xFF );       // Bit 25..32 = ein
    mm5450_wr( 3, 0x07 );       // Bit 33..35 = ein
    _delay_ms( 1000 );

    mm5450_wr( 1, 1 );          // startbit
    mm5450_wr( 8, 0x00 );       // Bit 1..8 = aus
    mm5450_wr( 8, 0x00 );       // Bit 9..16 = aus
    mm5450_wr( 8, 0x00 );       // Bit 17..24 = aus
    mm5450_wr( 8, 0x00 );       // Bit 25..32 = aus
    mm5450_wr( 3, 0x00 );       // Bit 33..35 = aus
    _delay_ms( 1000 );
  }
}


Peter

Autor: Flo Bien (bluefoxxp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der MM5450 ist nicht der schnellste, aber für meine Anwendung reichts 
:-)

Ich werd dein Prog mal austesten. Danke!

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.