AVR 7-segment Multiplex Probleme

OP #5523252
Hallo,
ich habe einen attiny2313 der ein vierstelliges 7-Segment Display 
gemultiplexed ansteuert. So wie hier: 
https://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
Das Programm habe ich in C geschrieben und mit AVR-GCC kompiliert. 
Soweit alles ganz simpel. Einzelne Digits anzusteuern funktioniert wie 
erwartet. Ebenfalls eine Zahl durchzuscrollen geht auch problemlos.
Wenn ich aber wie in angefügten Programm anfange die Digits 
durchzuscrollen (jeweils ein aufleuchten zu lassen, dann das nächste...) 
UND dazwischen die num variable zu ändern, sehe ich nur noch eine 7 bei 
der obere vertikale Balke fehlt.(also nur die a und c segmente eines 
Digits leuchten) Diese komische 7 scrollt dann unendlich lange durch.
Auch wenn ich versuche die num Variable um eins hochzuzählen (num++) 
kommen keine Zahlen mehr sondern nur einzelne Segmente.
An der Stromversorgung liegt es schonmal nicht, da es das gleiche sowohl 
am Programmer als auch am Labornetzteil tut.
Die Segmente an den Portpins (mit widerständen dazwischen):
a PB0
b PB1
c PB2
d PB3
e PB4
f PB5
g PD6
DP PA0
Die Digits am AVR: (an die Basis der PNP Transistoren über einen 
Widerstand)
1 PD2
2 PD3
3 PD4
4 PD5
MfG, Steven
Angehängte Dateien:
#5523341
Ohne jetzt dein eigentliches Problem gesucht oder gar gefunden zu haben 
- du solltest noch mal von vorn anfangen.

Die Umdierungsorgie ist übersichtlicher als switch/case-construkt. 
Nörmalerweise macht man das aber mit einer look-up-table im flash. Das 
ist die kleinste und auch die schnellste Lösung.

Die Multiplex-Ansteuerung solltest du in einem Timerinterrupt erledigen.

-alte Stelle aus
-neue Segmente ausgeben
-neue Stelle ein
-wenn durch von vorne

Dazu brauchst du ein char-array mit der Anzahl deiner Stellen. Dort 
schreibst du dann einfach asynchron deine Werte rein.
#5523586
Steven J. schrieb:
> PORTB |= ((segment & 0b00000001));

Und wo wird der Pin wieder rückgesetzt?
1
#include <avr/io.h>
2

3
void _7seg(uint8_t segmentnum, uint8_t segment){
4

5
  PORTD |= 0b00111101;          // all digits off
6
  if( !(segment & 0b01000000) )
7
    PORTD &= ~0b01000000; 
8
  PORTB = PORTB & 0b11000000 | segment & 0b00111111;
9
  PORTA &= ~0b00000001;
10
  if( segment & 0b10000000 )
11
    PORTA |= 0b00000001;
12
  PORTD |= (1<<segmentnum);     // wanted digit on
13
}
OP #5524370
Hallo,
danke für die Antworten.

Peter D. schrieb:
> void _7seg(uint8_t segmentnum, uint8_t segment){
>
>   PORTD |= 0b00111101;          // all digits off
>   if( !(segment & 0b01000000) )
>     PORTD &= ~0b01000000;
>   PORTB = PORTB & 0b11000000 | segment & 0b00111111;
>   PORTA &= ~0b00000001;
>   if( segment & 0b10000000 )
>     PORTA |= 0b00000001;
>   PORTD |= (1<<segmentnum);     // wanted digit on
> }

damit funktioniert es. Vielen Dank!
MfG, Steven

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.