Ausgang schaltet nicht

  • Frohe Ostern

achim S.

Premium Benutzer
16 Jan 2010
461
6
18
Nähe Basel
Sprachen
C
Hallo Gemeinde
habe da ein Problem mit einem kleinen C Programm.


CodeBox C und C++
#define F_CPU 16000000UL    // Angabe der Quarzfrequenz, wichtig für die Zeit
#include <util/delay.h>        // Einbindung Datei Pause
#include <avr/io.h>            // Einbindung Datei Ausgänge

int main(void)
{
    DDRA=0b10001111;        // Port A auf 1, auf Ausgang schalten
    DDRB=0b00000100;        // Port A auf 1, auf Ausgang schalten
    
    PORTA=0b10001111;        // Port A auf 1, auf Ausgang schalten
    PORTB=0b00000100;        // Port A auf 1, auf Ausgang schalten
    
    //PORTA = (1 << PA0);     // LED an Pin 0 von Port A aus
    //PORTA = (1 << PA1);     // LED an Pin 1 von Port A aus
    //PORTB = (1 << PB2);     // LED an Pin 1 von Port A aus
    while(1)                // Programmschleife
    {
        /*
        PORTA &= ~(1<<PA0);        // Schaltet Pin aus
        _delay_ms(500);        // Pause 500 ms
        PORTA |= (1<<PA0);        // Schaltet Pin ein
        _delay_ms(500);        // Pause 500 ms
        
        PORTA &= ~(1<<PA1);        // Schaltet Pin aus
        _delay_ms(500);        // Pause 500 ms
        PORTA |= (1<<PA1);        // Schaltet Pin ein
        _delay_ms(500);        // Pause 500 ms
        
        PORTA &= ~(1<<PA2);        // Schaltet Pin aus
        _delay_ms(500);        // Pause 500 ms
        PORTA |= (1<<PA2);        // Schaltet Pin ein
        _delay_ms(500);        // Pause 500 ms
        
        PORTA &= ~(1<<PA3);        // Schaltet Pin aus
        _delay_ms(500);        // Pause 500 ms
        PORTA |= (1<<PA3);        // Schaltet Pin ein
        _delay_ms(500);        // Pause 500 ms
        
        PORTA &= ~(1<<PA7);        // Schaltet Pin aus
        _delay_ms(500);        // Pause 500 ms
        PORTA |= (1<<PA7);        // Schaltet Pin ein
        _delay_ms(500);        // Pause 500 ms
        */
        PORTB &= ~(1<<PB2);        // Schaltet Pin aus
        _delay_ms(500);        // Pause 500 ms
        PORTB |= (1<<PB2);        // Schaltet Pin ein
        _delay_ms(500);        // Pause 500 ms
        
        //PORTB ^= (1 << PB2);    // Port A / PIN toggeln
        //_delay_ms(500);    // warten
        
    }
}

Verwende einen Attiny841 mit 16MHz und C. Habe die PA0, PA1, PA2, PA3, PA7 und PB2 mit LEDs von 5V mit einem Widerstand von ca. 1,2 KOhm belegt. Ausser dem Pin PB2 schalten alles Pins korrekt. Widerstand stimmt auch (nachgemessen). Die LED PB2 leuchtet leicht ohne auf das schalten zu reagieren ständig. Wenn ich die Spannungen messe scheint die LED ständig eingeschaltet zu sein. Der Prozessor ist neu (defekt?) Programmiere ich den Attiny erlischt die LED kurzzeitig. Damit scheint eigentlich der PB2 zu funktionieren. Die andern Pins habe ich auskommentiert. Auch toggeln funktioniert nicht.
So wie es aussieht bin ich zu blöd so etwas einfaches zu machen. Denkfehler oder Dummheit?
achim
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Hmm…
erstmal keine Idee.

Ändere den Code mal so, daß zweimal pro Sekunde 'ne "1" in Bit PB2 vom Pin-Register geschrieben wird.

CodeBox C und C++
PINB=(1<<PB2);
_delay_ms(500);
.
(???)

Ansonsten inkrementiere PORTB mal, statt B2 direkt zu manipulieren.

Ich sehen keine alternative Portfunktion, die Default, insbesondere 'per Fuse so einen Effekt hat.
Lasse mal den ins Port-Bit geschriebenen Wert zurücklesen und irgendwie ausgeben.

Wie is'n die LED angeschlossen? Vom Bein nach Gnd, oder vom Bein nach Vcc?
Programmiere ich den Attiny erlischt die LED kurzzeitig
Wenn Du den Controller im Reset hälst, ist sie aus?
Wenn Du ein leeres Programm flasht (leere main oder sowas, jedenfalls ohne DDR-B2 zu setzen oder ohne PORT-B2 zu setzen)?

Falls ich morgen..nächste Woche mal Zeit finde (unwahrscheinlich), such ich mal 'nen Tiny841 raus, und stelle das nach - oder stelle Dir mal ein ähnliches ASM-Hexfile bereit...

Nachtrag:
Die LED PB2 leuchtet leicht...
Hast Du mal die Fuses kontrolliert? Wäre ja eigentlich nicht Default, aber der Systemtakt kann per Fuse auch auf B2 ausgegeben werden. CLKO.
Die angegebenen 16MHz sind ja auch nicht Default - möglicherweise hast Du nebenbei auch CKOUT im Low Fuse Byte programmiert (Bit6=0).
Dann würde B2 auch mit 16MHz flackern, die LED also konstant schwacher leuchten. Mal'n LogicAnalyzer drangehalten?
 
Zuletzt bearbeitet:

Dirk

Administrator
Teammitglied
28 Jan 2007
4.242
127
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Hast Du mal die Fuses kontrolliert? Wäre ja eigentlich nicht Default, aber der Systemtakt kann per Fuse auch auf B2 ausgegeben werden. CLKO.
Die angegebenen 16MHz sind ja auch nicht Default - möglicherweise hast Du nebenbei auch CKOUT im Low Fuse Byte programmiert (Bit6=0).
Dies wird der Grund sein.

Siehe auch ...
Fuse einstellen für Attiny 841

CKOUT ist programmiert! Die "normale" Pinfunktion ist abgeschaltet.

Wenn der Takt nicht ausgegeben werden soll, dann
Low Fuse Byte = 0xEF
verwenden.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Ah...
an den anderen Thread hab ich nicht mehr gedacht, dort hat er ja bereits im Eröffnungspost selbst den default-8-Vorteiler abgeschaltet, vom internen RC-Oszi auf externen Quarz umgeschaltet, und(!) die Taktausgabe an B2 aktiviert. Du (Dirk) hattest das am Ende auch nochmal zusammengefaßt.
Frage an @achim S. also: Warum wurde dort eigentlich CKOUT benötigt? Hast Du das dann hinterher nur einfach vergessen?
(so wie ich bei meinem Mega8, der auf externen Quarz gefused in die Bastelkiste zurückgewandert war - und ich wundere mich, warum der AVRisp ihn nicht programmieren kann (ohne Quarz))
 

achim S.

Premium Benutzer
16 Jan 2010
461
6
18
Nähe Basel
Sprachen
C
Einen schönen Sonntag an alle
Habe die Reset Taste gedrückt und die PB2 geht vollständig aus so lange ich drücke. Die anderen LEDs am anderen Port arbeiten korrekt und blinken mit ca. 1 Sekunde Takt. Nutze solche Schaltung mit der Software auch immer um die Quarzfrequenz zu testen. Bei 500ms scheint alles zu stimmen. Werde noch mal nach den Fuse Einstellungen schauen. Kann es bei der Einstellung 2 verschieden Frequenzen für die Porst geben?
Bin auch noch mal dran die Spannungen am widerstand und LED zu messen. Habe LEDs mit 3mm für 20mA und 2mA, vielleicht vertauscht?
achim
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.242
127
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java

achim S.

Premium Benutzer
16 Jan 2010
461
6
18
Nähe Basel
Sprachen
C
Habe mal ein Bild von den Fuse gemacht. Habe die Einstellungen vom Ati 841 gelesen. Dabei ergibt sich aber was anderes ??? Sorry warum?
Wenn es an den Fusebit CKOUT liegt, müsste es sich nicht auch auf die anderen Pins auswirken?
 

Anhänge

achim S.

Premium Benutzer
16 Jan 2010
461
6
18
Nähe Basel
Sprachen
C
Habe die Einstellung noch mal angeschaut. Es ist AF nicht möglich sondern nur 8F. Keine Ahnung warum im Netz dazu AF angegeben ist. Habe auch den Vorwiderstand und LED überprüft bzw. gewechselt, alles korrekt. Die LED geht beim betätigen des Reset Tasters und länger gedrückt halten vollständig aus.
Das ist mir unklar.
 

Anhänge

Dirk

Administrator
Teammitglied
28 Jan 2007
4.242
127
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
Wenn es an den Fusebit CKOUT liegt, müsste es sich nicht auch auf die anderen Pins auswirken?
Nein, das wirkt nur auf PB2 (siehe Pin Konfiguration im Datenblatt), das wäre ja eigentlich auch nicht sinnvoll, wenn es auf alle anderen Pins wirken würde.
Schalte einfach mal den Haken bei CKOUT weg.



8020
 

achim S.

Premium Benutzer
16 Jan 2010
461
6
18
Nähe Basel
Sprachen
C
Also es liegt definitiv am programmierten Fusebit CKOUT.
Habe jetzt die Einstellung wie von Dirk angegeben gemacht. Damit schaltet PB2 korrekt. Es ergibt sich damit

EX 0xFF
HI 0xDF
LO 0xCF

Wieder was anderes. Hauptsache es funktioniert, wenn ich auch nicht genau weiss warum.
Warum wirkt sich CKOUT nur auf PB2 aus?
achim
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Wenn der Takt nicht ausgegeben werden soll, dann
Low Fuse Byte = 0xEF
verwenden.
Es ergibt sich damit
[…]
LO 0xCF
0xEF ist korrekt, das wäre &B11101111.
0xCF wäre &B11001111.

Der Unterschied ist das nicht genutzte Bit5. Wird keinen Unterschied machen, möglicherweise existiert dieses Bit gar nicht physisch. Der Default-Wert wäre aber "1"=unprogrammed...
(Die Tabelle hat Dirk in #9 ja freundlicherweise abgelichtet...)
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.242
127
63
Mittelhessen, Giessen
Sprachen
C, Assembler, Pascal, C++, PHP, Java
In der Tabelle steht drin "System clock output". Bedeutet das der PB2 mit den 16Mhz angesteuert wird?
Ich würde sagen ja, wenn du keinen Presacler für den SystemClock verwendest.

Clock Output Buffer
The device can output the system clock on the CLKO pin. To enable the output, the CKOUT fuse has to be programmed.
This mode is suitable when the chip clock is used to drive other circuits on the system. Note that the clock will not be
output during reset and that the normal operation of the I/O pin will be overridden when the fuse is programmed. Any
clock source, including the internal oscillators, can be selected when the clock is output on CLKO. If the System Clock
Prescaler is used, it is the divided system clock that is output.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.143
58
48
Hennigsdorf
Sprachen
BascomAVR, Assembler
Bedeutet das der PB2 mit den 16Mhz angesteuert wird?
Hmm… Jain...

Wenn CKOUT programmiert ist, wird für B2:
  • Pullup Override Enable, Data Direction Override Enable und Port Value Override Enable aktiviert - die drei Funktionen also von den Registern abgekoppelt und über die Override Multiplexer auf entsprechende andere Kanäle geschaltet
  • Der Pullup wird fest deaktiviert (PUOV=0)
  • Die Data Direktion wird fest auf Ausgang geschaltet (DDOV=CKOUT)
  • Das Eingangssignal des Port-Override-Multiplexers ist (Systemtakt AND CKOUT), also der Systemtakt. Vom Ausgang des Multiplexers geht's auf den Eingang des Ausgangstreibers des Beines.
Also ich würde eher sagen, daß der (effektive) Systemtakt auf das Bein geschaltet (verbunden) wird (ok, über den Multiplexer und den Treiber, aber da steckt dann keine aktive Steuerung dahinter).
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)