Forum: Mikrocontroller und Digitale Elektronik Mehrere Ports in arrays möglich?


von Jonany (Gast)


Lesenswert?

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;
}

von Michael (Gast)


Lesenswert?

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

von Ralf G. (ralg)


Lesenswert?

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
von Dieter F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.