Hallo Leute, ich probiere gerade, an einer kleinen Bargraphanzeige mit
10 LEDs im Multiplexing herum. Doch irgendwie klappt das bei mir mit dem
Timer0 des Attinys nicht so recht.
Die Schaltung habe ich angehängt und hier mein Quellcode:
1
//µC: Attiny2313
2
//Taktfrequenz: 1 MHz
3
4
//Taktfrequenz setzen
5
#define F_CPU 1000000
6
7
//Includes
8
#include<avr/io.h>
9
#include<util/delay.h>
10
#include<avr/interrupt.h>
11
12
13
//Variablen
14
intNumberPortD[11]={0x00,0x20,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60};//Bitmuster für die Zahlen für PortD
15
intNumberPortB[11]={0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};//Bitmuster für PortB
So
if (b == 0) {
PORTD &= 0x08;
} else {
PORTD &= 0x04;
}
wirst du aber nicht die erforderliche 1 am Pin zustande bringen, die
einen der beiden Transistoren zum durchschalten bringt
if (b == 0) {
PORTD |= 0x08;
} else {
PORTD |= 0x04;
}
Wieso eigentlich 0x08 und 0x04? Laut deinem SChaltplan hängen die
Transistoren an PD3 und PD4
Schreib das doch so ...
if (b == 0) {
PORTD |= 1 << PD3;
} else {
PORTD |= 1 << PD4;
}
... und lass dein Compiler ausrechnen, was das für eine Hex-Zahl ist.
Dann gibt es keine Fehler, weil du dich bei der Umrechnung der Pin
Nummer in eine Hex-Zahl vertan hast. Denn du schreibst dann die Pin
Nummer selber hin und der Compiler erledigt das Umrechnen. Und der weiß,
dass bei 0 angefangen wird zu zählen.
Keine Compilerwarnings?
OK. Dann Multimeter raus und an den µC Pins messen, ob sie auf High
sind.
Wenn nicht: Testprogramm, dass völlig ohne Timer auskommt
1
intmain()
2
{
3
DDRD=0xFF;
4
DDRB=0xFF;
5
6
PORTD=(1<<PD4);
7
PORTB=(1<<PB0);
8
9
while(1)
10
{
11
}
12
}
wieder messen. Wenn die Pins immer noch nicht 1 sind, dann läuft dein µC
nicht. Wenn die Pins 1 sind und trotzdem nichts leuchtet: Leiterbahnen
verfolgen und auf Unterbrechungen absuchen. Transistoren an der Basis
checken. Ist die 1 da? Haben die LED Spannung an der Anode? Gibt es eine
Unterbrechung in den Leiterbahnen? etc. etc.
also ich kann sagen, dass es aufjedenfall nicht an der Schaltung liegt.
Habe es mal mit Bascom blinken lassen und es hat funktioniert, auch am
Anfang in ( in der main blinken lassen und es hat funktioniert.
Irgendwie läuft aber der Timer nicht
Abc schrieb:> also ich kann sagen, dass es aufjedenfall nicht an der Schaltung liegt.> Habe es mal mit Bascom blinken lassen und es hat funktioniert, auch am> Anfang in ( in der main blinken lassen und es hat funktioniert.> Irgendwie läuft aber der Timer nicht
Die Timerkonfiguration ist in Ordnung, wenn der Name der ISR stimmt.
Drum hab ich nach Compiler Warnings gefragt, weil ich auch nicht
auswendig weiß, ob die beim Timer 0 so heißt (auf manchen AVR heißen die
anders)
Hast du auch das richtige Hex-File gebrannt (ist mir auch schon
passiert. AVR-Studio 4 ist da richtiggehend fies)
Im AVR-Studio den richtigen µC eingestellt?
Karl Heinz Buchegger schrieb:> Abc schrieb:>> also ich kann sagen, dass es aufjedenfall nicht an der Schaltung liegt.>> Habe es mal mit Bascom blinken lassen und es hat funktioniert, auch am>> Anfang in ( in der main blinken lassen und es hat funktioniert.>> Irgendwie läuft aber der Timer nicht>> Die Timerkonfiguration ist in Ordnung,
Äh, Moment.
Das CS01 Bit ist im Register TCCR0B
Datenblatt - Seite 76
Du musst bei jedem Bit kontrollieren, ob du auch im richtigen Register
bist. Nur weil bei einem Prozessortyp das CS01 in TCCR0A ist, heißt das
nicht, dass es bei einem anderen Prozessortyp auch dort ist.
Daher: Immer das Datenblatt zu Rate ziehen. Das ist deine einzige Bibel
deren Autorität über allem anderen steht. Bei den Timern ist zum
schnellen Nachschlagen immer der Abschnitt "Register Summary" im
jeweiligen Kapitel das Interessante.
Mit TCCR0B funktioniert es nun. Ja das mit den Registern ist so eine
Sache. Muss mich auch erstmal reinfinden habe davor ein wenig mit BASCOM
programmiert und PC-seitig mit Delphi und ab und zu ein wenig PHP/JS.
Ok, ich hab noch 'ne Frage. Ich deklariere ja die Variablen BarLeft und
BarRight für die Werte. Wenn ich diese nun bei der Deklaration gleich
mit einem Wert initialisiere, dann wird dieser auch angezeigt. Wenn ich
dort aber nichts zuweise und probiere in der main was zu zu weisen, dann
passiert nichts: