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
unsignedchardir[]={3,3,5,5,6,6,9,9,10,10,12,12};
11
unsignedcharprt[]={1,2,1,4,2,4,1,8,2,8,4,8};
12
13
unsignedchari;// counting index
14
15
intmain(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
return0;
37
}
Wie aber kommt man hier auf gerade diese Zahlenfolge der Variablen dir[]
und prt[]?
Bin für jede Hilfe Dankbar!
Gruß War10ck
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.
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
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!
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)
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
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
#define F_CPU 1200000
.
.
.
MCUCR |= (1 << PUD); // diasable all pull-ups
Kann mir jemand erklären, welche Bedeutung dieser Zeile (im Quelcode)
haben?
Danke!
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.
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