Forum: Mikrocontroller und Digitale Elektronik Einsteiger Hyperplexing Hilfe


von Tim X. (war10ck)


Lesenswert?

Hallo zusammen,
ich bin noch totaler Einsteiger im Bereich Microcontroller. Dazu habe 
ich mir ein Buch gekauft. In einem der ersten Kapitel wird nun das 
Hyperplexing am ATtiny13 beschrieben.
Das Prinzip und was der Programmcode machen soll habe ich auch 
verstanden.
1
// HyperPlexing - 12 LEDs @ ATtiny13
2
3
#define F_CPU      1200000
4
5
#define v        100    // delay time
6
7
#include <avr/io.h>
8
#include <util/delay.h>
9
10
unsigned char dir[] = {3, 3, 5, 5, 6, 6, 9, 9, 10, 10, 12, 12};
11
unsigned char prt[] = {1, 2, 1, 4, 2, 4, 1, 8,  2,  8,  4,  8};
12
13
unsigned char i;    // counting index
14
15
int main(void)
16
{
17
  MCUCR |= (1 << PUD);    // diasable all pull-ups 
18
  
19
  // all off
20
  DDRB  = 0b000000;
21
  _delay_ms(v);
22
    
23
  while (1)
24
  {    for (i = 0; i<=11; i++)
25
      {  DDRB  = dir[i]; 
26
        PORTB = prt[i]; 
27
        _delay_ms(v);
28
      }
29
      
30
      for (i = 0; i<=11; i++)
31
      {  DDRB  = dir[11-i]; 
32
        PORTB = prt[11-i]; 
33
        _delay_ms(v);
34
      }
35
  }
36
  return 0;
37
}

Wie aber kommt man hier auf gerade diese Zahlenfolge der Variablen dir[] 
und prt[]?
Bin für jede Hilfe Dankbar!

Gruß War10ck

von Karl H. (kbuchegg)


Lesenswert?

Klär uns auf:
Was wird in diesem Buch unter "Hyperplexing" verstanden?
(Könnte das sein, was der Rest der Welt "Charliplexing" nennt)


> Wie aber kommt man hier auf gerade diese Zahlenfolge der Variablen
> dir[] und prt[]?

Da die beiden Werte als Werte für DDRB bzw. PORTB benutzt werden, wird 
der Autor wohl hergegangen sein und sich die (für uns) unbekannte 
Aussenbeschaltung angesehen haben und in jedem Zeitschritt sich überlegt 
haben, wie die Pins stehen müssen. Also ganz einfach: Bestimmen der 
Zahlen durch Betrachten der Aussenbeschaltung in jedem gewünschen 
Zeitschritt.

von Tim X. (war10ck)


Lesenswert?

Okay, er versteht unter "Hyperplexing", dass man mithilfe von vier Pins 
zwölf LEDs seperat schalten kann.

Dann formulier ich meine Frage mal etwas um, ich weiß, dass um die erste 
LED zu schalten Pin 5 und 6 auf Output stehen müssen sprich PB0 und PB1. 
PB0 muss Highpotential besitzen PB1 hingegen Lowpotential. Warum 
deklariere ich nun aber mit ausgerechnet der ersten Zahl (3) diese 
Beiden Pins zu Ausgängen, also wie kommt gerade eine 3 zustande?

War10ck

von Klaus W. (mfgkw)


Lesenswert?

PB0 und PB1 sind die untersten Bits von PB.

Wenn die beiden gesetzt werden sollen, und die anderen nicht,
dann sieht das binär so aus:
  PORTB = 0b00000011;

Die Binärzahl 0b00000011 ist dezimal was? Eine 3!

von Karl H. (kbuchegg)


Lesenswert?

Tim X. schrieb:
> Okay, er versteht unter "Hyperplexing", dass man mithilfe von vier Pins
> zwölf LEDs seperat schalten kann.

Und wie macht er das?
(Nur du siehst den Schaltplan)

> Dann formulier ich meine Frage mal etwas um, ich weiß, dass um die erste
> LED zu schalten Pin 5 und 6 auf Output stehen müssen sprich PB0 und PB1.
> PB0 muss Highpotential besitzen PB1 hingegen Lowpotential. Warum
> deklariere ich nun aber mit ausgerechnet der ersten Zahl (3) diese
> Beiden Pins zu Ausgängen, also wie kommt gerade eine 3 zustande?


Ohne Schaltplan kann ich dir das nicht beantworten, weil ich nicht weiß, 
ob deine Schlussfolgerung, dass PB0 auf 1 und PB1 auf 0 stehen muss, 
richtig ist. Und im Zweifel vertraue ich dem Autor jetzt erst mal mehr 
als dir (Ist nichts persönliches).


Aber mal dir die Zahl bitmässig auf, vielleicht hilft dir das weiter.

  dez Hex  Binär          dez hex binär
   0   0    0000           8   8   1000
   1   1    0001           9   9   1001
   2   2    0010          10   A   1010
   3   3    0011          11   B   1011
   4   4    0100          12   C   1100
   5   5    0101          13   D   1101
   6   6    0110          14   E   1110
   7   7    0111          15   F   1111


dezimal 3 hat nun mal die Binärrepräsentierung, dass Bit 0 und Bit 1 
jeweils 1 sind.
(Und ja, die Binärrepräsentierungen der Zahlen von 0 bis F sollte man 
schon auswendig können)

von Tim X. (war10ck)


Lesenswert?

Oh Gott, man ich bin echt doof! Die Tabelle sich vor Augen zu halten hat 
geholfen.
Danke für die Gedult, bin halt wirklich noch ein Einsteiger.. ;)

War10ck

von LukeNukem (Gast)


Lesenswert?

Hallo Tim X.,

ich glaube, ich habe dasselbe Buch -- "AVR-Microcontroller in C 
programmieren" von Dr. Günter Spanner, Franzis Verlag 2010.

Der Trick an dieser Technik ist, daß die Pins des Mikrocontrollers drei 
Zustände einnehmen können: 1, 0, und input. 1 und 0 ziehen den Pin auf 
den jeweiligen Logik-Level, schließen bei dem behandelten ATTiny13 den 
Pin also mit VCC oder GND kurz. Der Zustand input ist hingegen, als wäre 
der Pin vom Stromkreis getrennt; da kann Spannung anliegen oder keine, 
es fließt kein Strom.

Dabei gilt folgendes:

DDRx | PORTx | Zustand
-----+-------+-------------------
  0  |  0/1  | Eingang (z-state)
  1  |   0   | Ausgang, logisch 0 (GND)
  1  |   1   | Ausgang, logisch 1 (VCC)

Eine LED, die zwischen zwei Pins angeschlossen ist, leuchtet genau dann, 
wenn deren Kathoden-Pin auf logisch 0 und ihr Anoden-Pin auf logisch 1 
gezogen wird. Dann sind beide Bedingungen erfüllt: es liegt zwischen den 
LED-Pins eine korrekt gepolte Spannung an, und es kann ein Strom 
fließen.

Haben beide Pins dasselbe logische Niveau, dann kann die LED daher nicht 
leuchten, weil die Spannung zwischen den beiden Pins der LED fehlt. Ist 
einer der Pins auf input geschaltet, leuchtet die LED ebenfalls nicht, 
denn dann kann kein Strom fließen -- im Zustand input ist der Pin des 
Mikrocontrollers "hochohmig", hat also einen sehr hohen Widerstand.

HTH,
Luke

von Ahmet N. (ahmet)


Lesenswert?

#define F_CPU      1200000
.
.
.
MCUCR |= (1 << PUD);    // diasable all pull-ups

Kann mir jemand erklären, welche Bedeutung dieser Zeile (im Quelcode) 
haben?

Danke!

von Stefan F. (Gast)


Lesenswert?

Disable all Pullups bedeutet auf deutsch "Deaktiviere alle 
Hochzieh-Widerstände".

Falls Dir der Begriff Pull-Ups unklar ist, dann google mal danach. Das 
gehört zu den Grundlagen, die man kennen sollte, bevor man sich mit 
solchen Trick-17 Schaltungen beschäftigt.

von Marius (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
Ich bin grade dabei einen knightrider mit dem attiny13 zu programmieren, 
aus dem buch was mein chef gekauft hat, hab ich den quellencode nicht 
verstanden. Ich bin nicht sehr begabt mit programmieren also hab ich 
gedacht ich schreib hier mal. dieser thread war bis jetzt der einzige 
der überhaupt in der nähe von meine aufgabe ist. Hier ist der Quellcode 
vom buch:

// RGB LED Fader

#define F_CPU 1200000
#include <avr/io.h>
#include <util/delay.h>

void  wait(int i)
{  int n = 0;
  while (n<i)  { _delay_us(50); n++;}
}

int main(void)
{  //PWM-init
  TCCR0A=0b10100011;
  TCCR0B=0b00000010;
  TCNT0=0x00;
  TIMSK0=0x00;
  OCR0A=100;
  OCR0B=0;

  DDRB = 0b00111;    //  select output ports
  DDRB |= (1<<PB4);  //

  int a = 10;  // strength LED 1
  int b = 10;  // strength LED 2
  int c = 10;  // strength LED 3

  int min = 10;
  int max = 200;

  while (1)
  {  // LED 1 up
    while (a<max)   {OCR0A=a; wait(100); a++; }

    // LED 2 up
    while (b<max)   {OCR0B=b; wait(100); b++; }

    // LED 3 up
    while (c<max)   {PORTB |= (1<<PB2); wait(c); PORTB &= ~(1<<PB2); 
wait(max-c); c++;}

    // LED 3 down
    while (c>min)   {PORTB |= (1<<PB2); wait(c); PORTB &= ~(1<<PB2); 
wait(max-c); c--;}

    // LED 2 down
    while (b>min)  {OCR0B=b; wait(100); b--;}

    // LED 3 up
    while (c<max)   {PORTB |= (1<<PB2); wait(c); PORTB &= ~(1<<PB2); 
wait(max-c); c++;}

    // LED 3 down
    while (c>min)   {PORTB |= (1<<PB2); wait(c); PORTB &= ~(1<<PB2); 
wait(max-c); c--;}

    // LED 1 down
    while (a>min)  {OCR0A=a; wait(100); a--;}


    // LED 1 up
    while (a<max)   {OCR0A=a; wait(100); a++; }

    // LED 1 down
    while (a>min)  {OCR0A=a; wait(100); a--;}

    // LED 2 up
    while (b<max)   {OCR0B=b; wait(100); b++; }

    // LED 2 down
    while (b>min)  {OCR0B=b; wait(100); b--;}

    // LED 3 up
    while (c<max)   {PORTB |= (1<<PB2); wait(c); PORTB &= ~(1<<PB2); 
wait(max-c); c++;}

    // LED 3 down
    while (c>min)   {PORTB |= (1<<PB2); wait(c); PORTB &= ~(1<<PB2); 
wait(max-c); c--;}
  }
}


also meine aufgabe ist es diesen quellcode so umzuschreiben das ich es 
mit zwei LEDs (sie anhang vom bild) erweitern soll. es sind schon 12 
LEDs vorhanden aber es sollen noch zwei dazu (sprich 14 LEDs). was muss 
ich machen um den knightrider so umzuschreiben das die letzten beiden 
LEDs leuchten?

Im anhang ist auch eine tabelle die ich für zwei weitere LEDs erweitert 
hab.

Entschuldigung für das schlechte deutsch, lebe nur seit drei jahren in 
Deutschland und lehrne jetzt erst deutsch zu schreiben.

Ich freue mich auf eure rückmeldung,
mfg. Marius

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.