www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einsteiger Hyperplexing Hilfe


Autor: Tim X. (war10ck)
Datum:

Bewertung
0 lesenswert
nicht 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.
// HyperPlexing - 12 LEDs @ ATtiny13

#define F_CPU      1200000

#define v        100    // delay time

#include <avr/io.h>
#include <util/delay.h>

unsigned char dir[] = {3, 3, 5, 5, 6, 6, 9, 9, 10, 10, 12, 12};
unsigned char prt[] = {1, 2, 1, 4, 2, 4, 1, 8,  2,  8,  4,  8};

unsigned char i;    // counting index

int main(void)
{
  MCUCR |= (1 << PUD);    // diasable all pull-ups 
  
  // all off
  DDRB  = 0b000000;
  _delay_ms(v);
    
  while (1)
  {    for (i = 0; i<=11; i++)
      {  DDRB  = dir[i]; 
        PORTB = prt[i]; 
        _delay_ms(v);
      }
      
      for (i = 0; i<=11; i++)
      {  DDRB  = dir[11-i]; 
        PORTB = prt[11-i]; 
        _delay_ms(v);
      }
  }
  return 0;
}

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

Gruß War10ck

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Tim X. (war10ck)
Datum:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Tim X. (war10ck)
Datum:

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

Autor: LukeNukem (Gast)
Datum:

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

Autor: Ahmet Narin (ahmet)
Datum:

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

Autor: Stefan Us (stefanus)
Datum:

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

Autor: Marius (Gast)
Datum:
Angehängte Dateien:

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

Beitrag #4181680 wurde vom Autor gelöscht.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.