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.
:
Bearbeitet durch User
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.