Forum: Mikrocontroller und Digitale Elektronik Attiny85+MAX7219 steckt in Testmode fest


von Stefan (Gast)


Lesenswert?

Hallo,

ich versuche gerade über einen Attiny85 mit Software SPI einen MAX7219 
zum laufen zu bringen. Leider scheint der MAX7219 im Test Modus 
festzustecken. Ich habe zwei 7-Segment Anzeigen angeschlossen, 100nF 
Kondensator am Max7219 und 100nF Kondensator am Attiny85, 10k Pullup am 
Reset Pin und 10k zwischen ISet und VCC. Leider leuchten nur alle sieben 
Segmente der Anzeigen. Das passiert auch, wenn ich keine Daten 
übertrage, sondern nur die Pins initialisiere. Mag jemand mal drüber 
schauen?

Hier mal der Code:
1
#define F_CPU 8000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
#define PIN_SS    PB3
7
#define PIN_CLK    PB4
8
#define  PIN_MOSI  PB1
9
10
#define SS_HIGH  PORTB |= (1<<PIN_SS)
11
#define SS_LOW  PORTB &= ~(1<<PIN_SS)
12
13
#define NO_OP      0x00
14
#define DECODE      0x09
15
#define INTENSITY    0x0A
16
#define SCAN_LIMIT    0x0B
17
#define SHUTDOWN    0x0C
18
#define DISPLAY_TEST  0x0F
19
20
#define DIGIT0  0x01
21
#define DIGIT1  0x02
22
23
#define BLANK  0xF 
24
25
void sendByte(char databyte) 
26
{
27
  for (int i=1;i<=8;i++)
28
  {
29
    if (databyte<127)
30
    {
31
      PORTB |= (1<<PIN_MOSI);
32
    }
33
    else
34
    {
35
      PORTB &= ~(1<<PIN_MOSI);
36
    }
37
    PORTB |= (1<<PIN_CLK);
38
39
    databyte = databyte<<1;
40
41
    PORTB &= ~(1<<PIN_CLK);
42
  }
43
}
44
45
void writeData (char data_register, char data)
46
{
47
  SS_LOW;
48
  sendByte(data_register);
49
  sendByte(data);
50
  SS_HIGH;
51
}
52
53
int main(void)
54
{
55
  DDRB = 0xFF;
56
  PORTB &= ~(1<<PIN_CLK);
57
  PORTB &= ~(1<<PIN_MOSI);
58
  SS_HIGH;
59
  writeData(DISPLAY_TEST,0);
60
  writeData(DECODE,0xFF);
61
  writeData(SCAN_LIMIT,1);
62
  writeData(INTENSITY,8);
63
  writeData(SHUTDOWN,1);
64
65
    while(1)
66
    {
67
    writeData(DIGIT0,BLANK);
68
    writeData(DIGIT1,BLANK);
69
  }
70
    return 0;
71
}

von Mario M. (thelonging)


Lesenswert?

Ersetze alle Vorkommen von "char" durch "uint8_t" und ändere den 
Vergleich "if (databyte<127)" nach "if (databyte>127)", dann müsste es 
funktionieren.

von Stefan (Gast)


Lesenswert?

Hallo Mario,

das hat es gerichtet :)
Vielen Dank!

von Stefan (Gast)


Lesenswert?

Hallo,

hab da nochmal ein Anliegen.
Hab das alles auf einer Platine aufgebaut, welche über einen Trafo 
(230VAC-> 24VAC), einen Gleichrichter und einen Festspannungsregler 
versorgt wird.
Schalte ich das ganze nun über einen Kippschalter ein, so scheint der 
MAX7219 nicht richtig initialisiert zu werden, da alle Segmente auf 
einmal leuchten.
Auch ein Reste des Attiny85 hilft in diesem Zustand nicht, weswegen ich 
den Fehler auf den Max7219 zurückführe. Beschaltet ist das ganze 
weiterhin wie oben beschrieben.

Schalte ich das ganze aus und danach schnell wieder ein funktioniert das 
ganze wie gewünscht. Mit einer anderen Spannungsquelle gab es keinerlei 
Probleme.

Vielleicht hat hier ja jemand eine Lösung dafür?

von Bleikopf (Gast)


Lesenswert?

Ich vermute dein Tasterprellt das könnte alles durch einander bringen

von Draco (Gast)


Lesenswert?

Mario M. schrieb:
> Ersetze alle Vorkommen von "char" durch "uint8_t" und ändere den
> Vergleich "if (databyte<127)" nach "if (databyte>127)", dann müsste es
> funktionieren.

Naja char und uint8_t spielt da keine Rolle. Da beide 1 Byte lang sind 
und hier eh bloß mit shiften gearbeitet wird.

Das das if (databyte<127) war der Schuldige.

Aber geht ja nun...


Zum jetzigen Problem:

Was macht die Schaltung wenn du sie mit normalen 5V versorgst? Prellen 
kann schon sein.

von Stefan (Gast)


Lesenswert?

Hallo,

scheint wirklich am Prellen gelegen zu haben. Habe im Code den Display 
Testmodus nochmal explizit ausgeschaltet und jetzt funktionierts.

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.