Hallo, bin Anfänger und habe das Problem, wenn ich zwei einfache LEDs
blinken lasse, blinkt LED1 an PB0 sauber mit voller Hellichkeit, LED2
blinkt auch an PB1 aber nicht mit voller Leuchtkraft.
Ports und LEDs sind OK.
Was kann ich tun bitte?
Würde mich über Tips sehr freuen, vielen Dank.
Hier der Code, Beispiel aus dem Netz, aber PB1 habe ich hinzugefügt,für
ein Attiny13 der extern an 5 Volt geschaltet ist.
*/
1
#define F_CPU 1000000UL
2
3
#include<avr/io.h>
4
#include<util/delay.h>
5
6
intmain(void)
7
{
8
// Pin 1 von Port B (PB1) als Ausgang schalten "DDRB |= (1 << PB1);"
9
10
DDRB=(1<<PB0);
11
12
// Endlosschleife
13
14
for(;;){
15
PORTB|=(1<<PB0);// bit im Portregister auf 1 setzen => LED leuchtet
16
_delay_ms(100);// warten
17
18
PORTB&=~(1<<PB0);// bit im Portregister auf 0 setzen => LED aus
19
_delay_ms(5000);// warten
20
21
PORTB|=(1<<PB1);// bit im Portregister auf 1 setzen => LED leuchtet
22
_delay_ms(500);// warten
23
24
PORTB&=~(1<<PB1);// bit im Portregister auf 0 setzen => LED aus
meckermann schrieb:> Bleibe konsistent beim Setzen der Klammer-Ebenen.
Peter Danneggers Variante scheint bei den meisten C-Programmierern
üblich zu sein (so auch bei meinen SW-Kollegen), ich verwende aber auch
deine Variante, weil sie mir übersichtlicher erscheint.
Also keine Konsistenzfrage und nichts zu meckern :-)!
Danke Hilde,
bin in C absolut Neu und gebe dir Recht
Allerdings finde ich Peters Code auch übersichtlich, wenn ich denn den
Code in einigen Jahren evtl. mal verstehen werde.:)
HildeK schrieb:> Also keine Konsistenzfrage
Doch, sonst müsste ja man (ich hab den Code ja im Ganzen zitiert)
mit
int main() { ....
anfangen.
Der "Unsinn" die Klammer an einer anderen Ebene zu schliessen
gegenüber dem Punkt wo sie geöffnet wurde ist sogar in ATMEL
Code (ASF) weit verbreitet. Für mich ist das Chaos .....
HildeK schrieb:> Also keine Konsistenzfrage
vermutlich wegen
int main()
{
und nicht
int main(){
aber ich verwende wegen Übersichtlichkeit wie Du die { in einer neuen
Zeile
meckermann schrieb:> Für mich ist das Chaos .....
In einem kleinen Projekt bzw Source Code mag das noch
überschaubar sein, aber wenn es der Klammer-Ebenen zuviel
wird dann ist es echt Chaos.
meckermann schrieb:> Klammer-Ebenen zuviel> wird dann ist es echt Chaos.
Wenn man statt edlin einen vernünftigen Editor verwendet, bleiben beide
Varianten und nach 4711 Schachtelebenen übersichtlich.
SCNR
P.S.: Ich bevorzuge auch Peter Variante.
meckermann schrieb:> Bleibe konsistent beim Setzen der Klammer-Ebenen.
Ich benutze den Klammerungsstil als Unterscheidungsmerkmal.
Nur eine Funktion hat die '{' in einer extra Zeile.
Dadurch kann ich leichter erkennen, wann eine neue Funktion beginnt und
wann nur ein conditional Block darin.
Naja, solange man nur den eigenen Code verstehen muss, sind die
verwendeten Varianten weitgehend egal. Ich kann hier im Forum gut mit
beiden oder den gemischten Varianten leben.
Ich habe eher Probleme, den Teile von Peters Code in sbit.h zu
verstehen:
Joey N. schrieb:> wenn ich denn den> Code in einigen Jahren evtl. mal verstehen werde.:)
Warum so pessimistisch.
Frag ruhig, wenn Du etwas nicht verstehst.
Ich habe ihn absichtlich nicht kommentiert.
Ich hab auch nicht versucht den Zeitablauf aus Deinem Code zu
extrahieren.
Ich denke aber, daß das Prinzip klar wird, wie man mehrere Tasks
gleichzeitig und unabhängig voneinander ausführen kann.
Hallo Peter, Entschuldigung, das war keine Kritik an dich.
Ich wollte nur zum Ausdruck bringen, das ich Neu bin und gerne so
programmieren könnte wie du.
Das war sowieso mein nächstes Ziel, wie ich die LEDs unabhängig
voneinander ansteuern kann.
Ich bedanke ich mich nochmals für den tollen Code und frohes Neues.
lg
HildeK schrieb:> #define SBIT_(port,pin) ((*(volatile struct bits*)&port).b##pin)> #define SBIT(x,y) SBIT_(x,y)> [/c]> speziell mit den Ausdrücken:>
1
>__attribute__((__packed__))
2
>
der Zweck von 'packed' besteht darin, dass der COmpiler nicht auf blöde
Ideen kommt, und zwischen die einzelnen Strukturmember in
1
structbits{
2
uint8_tb0:1,b1:1,b2:1,b3:1,b4:1,b5:1,b6:1,b7:1;
3
}__attribute__((__packed__));
noch Alignment Bytes hineinpackt, weil er dir schnellstmöglichen zugriff
auf die Member ermöglichen will. An dieser Stelle wollen wir den
Compiler dazu zwingen, dass er alle 8 Bit Member in genau 1 Byte packt.
>
@Karl Heinz (kbuchegg)
Herzlichen Dank für die Erklärung!
Ich habe bisher nur die einfachen Preprocessor Kommandos verwendet. Da
scheint viel möglich zu sein, ich muss mich wohl damit mal intensiver
beschäftigen ...