Hallöchen,
ich bin ein bisschen überfragt und weiss nicht mehr so ganz weter. Ich
habe unten gennantes Programm geschrieben. Die Aufgabenstellungg lautet,
wir bekommen ein Analoges Signal von einem Microcontroller und sollen
dies auf zwei 7 Segment-Anzeigen anzeigen lassen.
Ich habe einen Atmega88a, konnte für die erste 7-Segment-Anzeige also
von PORTC Segment A = PD0, B = PD1 ... H = PD8 [segment_1]
Jetzt will ich das ganze mit meiner zweiten Anzeige machen, komme jedoch
nicht weiter, da ich nicht genug PINS zur verfügung habe. Ich konnte mit
PORTC alle Segmente belegen, jedoch das letzte musste ich auf PB2
legen(auf das letzte Segment also der Punkt kann ich verzichten)
[segment_2]
Nun mein Problem: Sobald ich ein char schreibe und das dann definiere
auf PORTC, fällt natürlich PORTB raus und ich kann es nicht in mein char
einpflegen.
Wie schaffe ich es also, den PB2 in mein char bzw meine Bitkombi zu
bekommen? Ich kann ja auch nicht ein eizelnes char für den PIN
schreiben, denn ich kann die beiden ja auch nicht gleichzeitig
ausführen. [segment_3]
Danke schonmal für die Antworten!
Gruß
Jonny
---------------------------------------------------------------------
#include <avr/io.h>
#define F_CPU 8000000UL
#include <util/delay.h>
#define AA (1<<PC0)
#define BB (1<<PC1)
#define CC (1<<PC2)
#define DD (1<<PC3)
#define EE (1<<PC4)
#define FF (1<<PC5)
#define GG (1<<PB2)
#define HH (1<<PB1) //auf den kann ich verzichten
int main(){
DDRD=0xFF;
DDRC=0xFF;
DDRB = 0x6;
//char
segment_1[]={0x84,0xd3,0xd6,0xb1,0x76,0x77,0xc4,0xf7,0xf6,0xe7};
//das ist der für die erste Anzeige, der funktioniert auch klasse
char segment_2[]={ 0x3f,0x06,0x1b,0x0f,0x32,0x2d,0x3d,0x07,0x3f,0x2f};
//hier habe ich das Segment G nicht mit dabei
//char
segment_3[]={0x00,0x00,0x40,0x40,0x40,0x40,0x40,0x00,0x40,0x40};
/*das ist die Bitkombi für das einzelne Segment, dass ich aber leider
nicht gleichzeitig mit dem anderen ausführen kann*/
while (1){
for(int f=0;f<10;f++){
PORTC = segment_2[f]; //7Segment Anzeige die durchzählt
_delay_ms(64);
/*PORTD = segment_1[f];
_delay_ms(64);*/ //char, der funktioniert
}
}
return 0;
}
Nicht direkt als Antwort auf "wie mehrere Ports in Array", aber zu deiner Beschaltung: Man kann auch beide Anzeigen auf den gleichen Port legen und nimmt den anderen Port (bzw. einzelne Pins davon) nurnoch zum selektieren der gerade gewünschten Anzeige. Dann kannst du immer alles auf den gleichen Port schreiben und musst nicht je nach Ziffer erstmal schaun, was du wo ausgeben musst. Sog. Multiplexing https://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
Ganz normale Bitmanipulation. Siehe: https://www.mikrocontroller.net/articles/Bitmanipulation Sowas muss dann programmiert werden. Zum Beispiel:
1 | // Segmentwert |
2 | 0b01010101 |
3 | // auf verschiedene Ports aufgeteilt |
4 | |||||||| |
5 | PORTA PIN 3210|||| /* obere 4 SegmentBits -> untere 4Bits auf PORTA */ |
6 | PORTB PIN 7||| /* Segment Bit3 -> Bit4 auf PORTB */ |
7 | PORTC PIN 432 /* untere 3 SegmentBits -> Bits2..4 auf PORTC */ |
- Segmentwert in temporäre Variable übernehmen - gewünschte Bits maskieren und verschieben - Zielbits löschen - mit PORTx verodern Das ganze für jeden Block.
Das Stichwort lautet "Multiplexing" oder "Charlieplexing" https://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.