AVR Studio 6 - unerklärlicher fehler

Likeagenius

Cadet 2nd Year
Registriert
Feb. 2015
Beiträge
17
hey,

ich habe nun einen Code durch nen Kumpel bekommen, der sich damit auskennt.

Nun ist mein einziges Problem das einspielen..

Und zwar bekomme ich diese Fehlermeldung:
avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude.exe: Device signature = 0x1e9007
avrdude.exe: erasing chip
avrdude.exe: reading input file "C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex"
avrdude.exe: input file C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex auto detected as Intel Hex
avrdude.exe: writing flash (784 bytes):

Writing | avrdude.exe: error: usbasp_transmit: usb_control_msg: sending control message failed, win error: Ein an das System angeschlossenes Gerät funktioniert nicht.


avrdude.exe: error: wrong count at writing ffffffff
################################################## | 100% 2.31s

avrdude.exe: 784 bytes of flash written
avrdude.exe: verifying flash memory against C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex:
avrdude.exe: load data flash data from input file C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex:
avrdude.exe: input file C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex auto detected as Intel Hex
avrdude.exe: input file C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex contains 784 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 0.59s

avrdude.exe: verifying ...
avrdude.exe: 784 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done. Thank you.

Falls relevant der Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <stdlib.h> // ka denke nicht nötig

enum uCState {
STATE_MAIN = 0,
STATE_WAIT = 1,
STATE_BUZZ = 2
};

enum uCState currentState;

uint16_t _ovf_cnt = 0;

ISR(TIMER0_OVF_VECT)
{
/* Overflow Zähler erhöhen */
++_ovf_cnt;
}

void timer_reset(void)
{
uint8_t oldSREG = SREG;
/* Interrupts deaktivieren */
cli();

/* Timer zurück setzen */
_ovf_cnt = 0;
TCNT0 = 0;

/* SREG wiederherstellen */
SREG = oldSREG;
}

uint8_t timer_get(void)
{
uint8_t oldSREG = SREG, scnds = 0;
/* Interrupts deaktivieren */
cli();

/*
1 Overflow 1024 uS
_ovf_cnt XXX S
*/
scnds = (_ovf_cnt / 1) * 1024E-6;

/* SREG wiederherstellen */
SREG = oldSREG;

return scnds;
}






int main(void)
{
// PB3 als EINGANG definieren
// PB4 als AUSGANG definieren
DDRB = 0b00010000;
/* Gesamter Port B auf 0 setzen */
PORTB = 0b00000000;

/* Timer Konfigurieren */
TCNT0 = 0;
// Timer Overflow Interrupt zulassen
TIMSK0 = 0b00000010;

// Normaler Modus
TCCR0A = 0b00000000;
// Prescaler von 1024 einstellen
TCCR0B = 0b00000101;

/* Globale Interrupts erlauben */
sei();

/* Zustand ist MAIN */
currentState = STATE_MAIN;

/* Endlos Schleife */
while (1) {
switch (currentState) {
case STATE_MAIN: {
/* Warten bis der Taster an PB3 gedrückt wurde */
if (PINB & 0b00001000) {
currentState = STATE_WAIT;
/* Timer zurücksetzen */
timer_reset();
}
} break;

case STATE_WAIT: {
/* Warten bis 2 Min. und 20 Sek. verstrichen sind */
if (timer_get() >= 180) {
/* State wechseln */
currentState = STATE_BUZZ;
/* Timer zurücksetzen */
timer_reset();
}
} break;

case STATE_BUZZ: {
/* Buzzer anstellen */
PORTB |= 0b00010000;
/* Warten bis 3 bis 5 Sekunden verstrichen sind */
if (timer_get() >= 3) {
/* Buzzer ausstellen */
PORTB &= 0b11101111;
/* Ins MAIN zurückspringen */
currentState = STATE_MAIN;
}
} break;
}
}
}


angeschlossen hab ich es so:
USBASPcon.png

bis auf bei VCC den shotky und den 5V JP und einen 10kOhm widerstand zwischen VCC und Reset

Ich habe nen ATTiny13a angeschlossen und benutze einen Guloprog
Wer kann mir helfen?
 
Zuletzt bearbeitet:
Hmm ich würde auf den ersten Blick sagen, es ist das Löschen des ATTiny. Kannst du mal noch den AVRDude Aufruf posten?
 
Welchen AVRDude aufruf meinst du denn? Meinst du diesen hier?

Command: C:\Users\Thomas\Desktop\gulo\avrdude.exe
Argument: -e -c USBasp -p ATtiny13 -e -U flash:w:"$(ProjectDir)Debug\$(ItemFileName).hex":a

Der Ordner enthält avrdude.exe, die .conf und den libusb0.dll treiber
 
Lass mal das zweite "-e" weg.

Nein,vielleicht eher das erste. Er wird das in deiner Reihenfolge abarbeiten. Vorher weiß er nicht welcher Programmer bzw. Controller-Typ programmiert werden soll. Vielleicht ist es auch egal. Probier es aus :)
 
Zuletzt bearbeitet:
Danke ich glaub das sollte so richtig sein oder?
avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude.exe: Device signature = 0x1e9007
avrdude.exe: erasing chip
avrdude.exe: reading input file "C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex"
avrdude.exe: input file C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex auto detected as Intel Hex
avrdude.exe: writing flash (784 bytes):

Writing | ################################################## | 100% 0.99s

avrdude.exe: 784 bytes of flash written
avrdude.exe: verifying flash memory against C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex:
avrdude.exe: load data flash data from input file C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex:
avrdude.exe: input file C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex auto detected as Intel Hex
avrdude.exe: input file C:\Users\Thomas\Documents\Atmel Studio\6.2\GccApplication1\GccApplication1\Debug\GccApplication1.hex contains 784 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 0.59s

avrdude.exe: verifying ...
avrdude.exe: 784 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done. Thank you.

Falls ja, das erste -e wars :D

vielen dank :)

Edit nun hab ichs ausprobiert, und irgendwie klappt das nicht.. Der code sollte eigentlich soweit Korrekt sein.. Ich habe das so angeschlossen (sorry für paint zeichnung.. :D):
schaltung.png

Woran könnte der Fehler liegen?

Hab eben die LED mal zwischen + und pb4 gehalten, sie leuchtet.. Zwischen den andren Kontakten wie z.B pb3 nicht. auch nicht umgekehrt also GND gegen eines der Kontakte..
 
Zuletzt bearbeitet:
Initialisiere mal portb mit 0b00001000
Du hast an portb3 keinen pullup. Da er auf Eingang geschaltet ist und portb3 auf 0 initialisiert wird, wirst du immer nur eine 0 zurück lesen.
Ergänzung ()

Deine Schaltung schaltet den Port gegen Masse. Entweder schaltest du gegen vcc oder du lässt alles so und änderst noch den Code.

Dann musst du aber pinb3 auf 0 überprüfen und nicht auf 1.

Also if ( 0 == ( 0b00001000 & pinb ) )

Es wird übersichtlicher es so zu schreiben
If ( 0 == ( (1 <<PINB3) & PINB ) ) )

Da muss man auch nicht die Bitposition zählen
 
Zuletzt bearbeitet:
Okay ich versteh grad nur bahnhof, sorry :confused_alt:

Ich bin hier wirklich noch komplett neu und der Code stammt von nem Kumpel, aber der ist grad nicht mehr online.. xD
Kannst du mir das vielleicht nochmal für ganz dumme erklären? :)
 
In dem Programm wartest du doch auf dem Tastendruck mit der zeile:

if (PINB & 0b00001000){

Das änderst du in

if (0 == ( PINB & 0b00001000)) {


Und ganz oben bei der Initialisierung von Portb

/* Gesamter Port B auf 0 setzen */
PORTB = 0b00000000;

Auf

/* Port B Initialisierung */
PORTB = 0b00001000;


Ich mach das gerade über das Handy. Ich hoffe das stimmt soweit.
 
Ich hab das jetzt abgeändert, aber leider passiert da nix, zumindest leuchtet die LED immer noch nicht :(

Hab zum testen mal im Switch direkt auf die LED schalten lassen und den Timer übersprungen, aber dennoch leuchtet die LED nicht :/

Die LED selbst geht..
 
Die Reaktion kommt aber verzögert... wenn der Rest stimm
 
Also selbst nach 5 Minuten Passiert da leider nix :(
Hab die zeit auch zum testen mal nur auf 20 Sekunden runtergeschraubt.

Aber selbst dann passiert nach 3 Minuten noch nix
 
Zum testen kannst du folgendes probieren..
Nach dem

/* Endlos Schleife */
while (1) {


fügst du noch eine zweite while schleife ein..

while (1) {

if (0 == ( PINB & 0b00001000)) PORTB |= 0b00010000;
else PORTB &= ~0b00010000;

}


Das sollte bewirken, dass die led sofort leuchtet wenn der Taster gedrückt wird oder umgekehrt, je nach Beschaltung.
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>
#include <stdlib.h> // ka denke nicht nötig

enum uCState {
STATE_MAIN = 0,
STATE_WAIT = 1,
STATE_BUZZ = 2
};

enum uCState currentState;

uint16_t _ovf_cnt = 0;

ISR(TIMER0_OVF_VECT)
{
/* Overflow Zähler erhöhen */
++_ovf_cnt;
}

void timer_reset(void)
{
uint8_t oldSREG = SREG;
/* Interrupts deaktivieren */
cli();

/* Timer zurück setzen */
_ovf_cnt = 0;
TCNT0 = 0;

/* SREG wiederherstellen */
SREG = oldSREG;
}

uint8_t timer_get(void)
{
uint8_t oldSREG = SREG, scnds = 0;
/* Interrupts deaktivieren */
cli();

/*
1 Overflow 1024 uS
_ovf_cnt XXX S
*/
scnds = (_ovf_cnt / 1) * 1024E-6;

/* SREG wiederherstellen */
SREG = oldSREG;

return scnds;
}






int main(void)
{
// PB3 als EINGANG definieren
// PB4 als AUSGANG definieren
DDRB = 0b00010000;
/* Gesamter Port B auf 0 setzen */
PORTB = 0b00001000;

/* Timer Konfigurieren */
TCNT0 = 0;
// Timer Overflow Interrupt zulassen
TIMSK0 = 0b00000010;

// Normaler Modus
TCCR0A = 0b00000000;
// Prescaler von 1024 einstellen
TCCR0B = 0b00000101;

/* Globale Interrupts erlauben */
sei();

/* Zustand ist MAIN */
currentState = STATE_MAIN;

/* Endlos Schleife */
while (1) {
while (1) {

if (0 == ( PINB & 0b00001000)) PORTB |= 0b00010000;
else PORTB &= ~0b00010000;

}
switch (currentState) {
case STATE_MAIN: {
/* Warten bis der Taster an PB3 gedrückt wurde */
if (0 == ( PINB & 0b00001000)) {
currentState = STATE_WAIT;
/* Timer zurücksetzen */
timer_reset();
}
} break;

case STATE_WAIT: {
/* Warten bis 2 Min. und 20 Sek. verstrichen sind */
if (timer_get() >= 20) {
/* State wechseln */
currentState = STATE_BUZZ;
/* Timer zurücksetzen */
timer_reset();
}
} break;

case STATE_BUZZ: {
/* Buzzer anstellen */
PORTB |= 0b00010000;
/* Warten bis 3 bis 5 Sekunden verstrichen sind */
if (timer_get() >= 3) {
/* Buzzer ausstellen */
PORTB &= 0b11101111;
/* Ins MAIN zurückspringen */
currentState = STATE_MAIN;
}
} break;
}
}
}

Also das ist mein Aktueller Code..

Und der Aufbau ist noch der Selbe wie im Bild, das ist ja Richtig oder?
Oder sollte ich jetzt Auf VCC schalten? Aber selbst dabei passiert nix :/
 
Überprüfe nochmal deine Beschaltung. Pin2 am Controller ist pb3. Was der Taster sein sollte!?

Pin3 ist pb4 und steuert als Ausgang die led an!?
 
Ja genau so hab ich das.

vom Punkt aus Links:
Reset, Taster, LED, GND

Vom Punkt Rechts:
VCC, SCK, MISO, Mosi
 
Hast du ein multimeter? Du müsstest an pb3 die vcc messen können. Und wenn du den Taster drückst muss dort Masse Anliegen.
 
Also an PB3 liegt garkeine Spannung an.. und auch kein GND aber an PB4 liegt der GND an
 
Bau mal den Taster aus, und teste ihn mit der Widerstands-Messung ob er hochohmig ist >100kOhm , bzw. niederohmig ~ <10 Ohm ist, wenn du ihn drückst.
Ergänzung ()

Der Compiler meckert bei deiner ISR. Und zwar nennt sich die Interrupt-Quelle nicht

ISR( TIMER0_OVF_VECT )

sondern

ISR(TIM0_OVF_vect)
Ergänzung ()

Ändere nochmal von:
Code:
while (1) {

if (0 == ( PINB & 0b00001000)) PORTB |= 0b00010000;
else PORTB &= ~0b00010000;

}


Code:
while (1) {

if (0 == ( PINB & 0b00001000)) PORTB &= ~0b00010000;
else PORTB |= 0b00010000;

}

Leuchtet die LED dann?
 
hab das abgeändert,

immernoch kein Erfolg :/

Und der schalter hat 010-005 Ohm bei 2K Ohm messung


Nachtrag:
Hab die While auch geändert, nein sie Leuchtet auch nicht, egal ob mit SChalter oder einfach so. :(
 
Zuletzt bearbeitet:
füge nach der main() folgenden Code hinzu:

Code:
int main(void)
{
	uint32_t	ui32_PreScaler = 0;
	
	DDRB = ( 1<<PINB3 ) | ( 1<<PINB4 );
	PORTB = 0x00;
	while ( 1 )
	{
		if ( 200000LU <= ++ui32_PreScaler )
		{
			ui32_PreScaler = 0;
			
			PINB |= ( 1<<PINB3 ) | ( 1<<PINB4 );
		}
	}

	// .... alter code geht hier weiter 

	// PB3 als EINGANG definieren
	// PB4 als AUSGANG definieren
Ergänzung ()

Der Code bewirkt dass, nach einer gewissen Zeit beide Pins (PB3&PB4) invertiert werden. Also von 0->1 bzw. 1->0. Damit sollte die auf jeden Fall blinken. Wenn das immer noch nicht geht, muss was mit deiner Schaltung faul sein. Der Simulator meint es würde gehen. Wir vertrauen ihm einfach mal.
 
Zurück
Oben