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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jonany (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Das Stichwort lautet "Multiplexing" oder "Charlieplexing"

https://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.