C Atmega2560

avr_newbie

Mitglied
13. Apr. 2013
127
0
16
Bayern
Sprachen
  1. ANSI C
Hallo,

bin heute umgestiegen von Atmega128 auf Atmega2560
Hab das Mega2560-USB aus dem Onlineshop.

Ich verwende AVR studio 6 und AVRISP mkII

Wenn ich die Device Signatur lesen möchte, kommt folgende Fehlermeldung:

Unable to enter programming mode.

Please verify device selection, interface settings, target power and connections to the target device

Hat jemand damit Erfahrung? Ich such jetzt schon seit Stunden, und find keinen Fehler....
 
Hallo,

das Mikrocontrollermodul ist im Lieferzustand auf externe Spannungsversorgung an VCC Pins eingestellt. Vielleicht hast du hier keine Spannungsquelle angeschlossen.

Wenn du 5V USB VBUS Spannung verwenden möchtest, musst du Jumper J3 brücken, J5 ist offen.

Dirk :ciao:


Please verify device selection, interface settings, target power and connections to the target device

POWER SUPPLY CONFIGURATION

EXTERNAL SUPPLY VOTAGE APPLIED TO +UB PIN:
J3 OPENED
J5 CLOSED

EXTERNAL SUPPLY VOTAGE APPLIED TO ANY VCC PIN:
J3 OPENED
J5 OPENED

USB VBUS VOLTAGE 5V (1)
J3 CLOSED
J5 OPENED

(1) USB VBUS voltage 5V is always available at pin CON1-1. If supplying external components with
VBUS voltage PLEASE NOTE THE MAXIMUM CURRENT CAPABILITY OF USB VBUS!
 
5V an VCC und GND sind angeschlossen

und 16Mhz Quarz hab ich eingelötet....

Habs jetzt mit dem zweiten probiert, da ich mir gleich 2 gegönnt hab ^^
Selbe Problem.....
 
Dann fällt mir noch ein:

(1) ISP Frequenz auf 100kHz (bzw. 125kHz einstellen), jedenfalls nicht zu hoch. Diese muss kleiner als 1/4 der Systemtaktfrequenz sein. Der Mikrocontroller läuft mit internem RC-Oscillator (8MHz), der Systemtakt ist 1MHz (CKDIV8 Fusebit programmiert)

(2) ISP Stecker richtig herum stecken



EDIT:

und 16Mhz Quarz hab ich eingelötet....

Der Quarzoszillator läuft nicht mit 16MHZ, da dieser nicht durch Fusebits aktiviert ist. Systemtaktquelle ist der interne RC-Oszillator, 1MHz Systemtakt.
 
Der Quarzoszillator läuft nicht mit 16MHZ, da dieser nicht durch Fusebits aktiviert ist. Systemtaktquelle ist der interne RC-Oszillator, 1MHz Systemtakt.

.... ähm....

hab ich ihn dann jetzt geschrottet?

naja.. auf jeden fall, der ISP stecker ist wohl richtig rum drauf, da es mir ja 5 V Target Voltage anzeigt? ....

auch mit 100khz geht nix...
 
.... ähm....

hab ich ihn dann jetzt geschrottet?

Nein, der Quarz-Oszillator ist nur von Werk aus deaktiviert. Es ist IMMER der interne RC-Oszillator die Systemtaktquelle. Es kann ja auch sein, dass man keinen Quarz möchte und dieser auf der Platine nicht bestückt ist. Dann wäre kein Systemtakt vorhanden, wenn der Quarzoszillator ausgewählt wäre ... und Systemtakt benötigt man für ISP-Programmierung.

Hast du sonst schon etwas an IO-Pins angeschlossen, was eventuell ISP-Signale beeinflussen könnte. Ansonsten Stecker nochmal prüfen (sauber machen). Mehr fällt mir eigentlich sonst nicht mehr ein :-/

EDIT:

Den richtigen Mikrocontroller hast du im Programmierdialog ausgewählt ?!
 
Nein, der Quarz-Oszillator ist nur von Werk aus deaktiviert. Es ist IMMER der interne RC-Oszillator die Systemtaktquelle. Es kann ja auch sein, dass man keinen Quarz möchte und dieser auf der Platine nicht bestückt ist. Dann wäre kein Systemtakt vorhanden, wenn der Quarzoszillator ausgewählt wäre ... und Systemtakt benötigt man für ISP-Programmierung.

Hast du sonst schon etwas an IO-Pins angeschlossen, was eventuell ISP-Signale beeinflussen könnte. Ansonsten Stecker nochmal prüfen (sauber machen). Mehr fällt mir eigentlich sonst nicht mehr ein :-/

EDIT:

Den richtigen Mikrocontroller hast du im Programmierdialog ausgewählt ?!

ahhhhhhhhhhh.. fuck...

es geht... :D

-.-

naja.. hab immer nur mitm schieber 125khz ausgewählt.....
wenn ich 100khz genau einstell, dann gehts... ziemlich pingelig ^^

ähm, wie muss ich die fuse einstellen, für 16Mhz

da gibts fsoc / extosc ? was is da der unterschied?

- ok, kommt wohl nur fsoc in Frage?
da gibts aber
FSOC_16KCK_65MS_XOSC_SLOWPWR
FSOC_16KCK_65MS_XOSC_FASTPWR
FSOC_16KCK_0MS_XOSC_BODEN

was muss ich da nehmen?
FSOC_16KCK_65MS_XOSC_SLOWPWR ??
 
Bevor du die Fuses programmierst:

zuerst einlesen,

dann ändern,

dann programmieren!
 
seit ich den Atmega2560 verwende, will mein Display nicht mehr so richtig..

Irgendwie hakt die Anzeige... der Counter, der in der while schleife läuft hakt auch rum


Code:
   #define DISPLAY_SPI_MODE_HARDWARESPI true  // true or false



    #if (ARCH == ARCH_AVR8)

    /***
    Configuration of hardware related section for AVR microcontroller
    ***/    

        /***
        Display SPI Signal assignment
        ***/

        #define DISPLAY_SPI_PORT         PORTB
        #define DISPLAY_SPI_DATADIR      DDRB
        #define DISPLAY_SPI_INPORT       PINB
        #define DISPLAY_SPI_MISO         PB3
        #define DISPLAY_SPI_MOSI         PB2
        #define DISPLAY_SPI_SCK          PB1

        #define DISPLAY_SPI_SPEED_FCPU_DIV 8 // allowed values: 2, 4, 8, 16, 32, 64, 128 (for spi module only) 


        /***
        Display Control Signal assignment   
        ***/

        #define DISPLAY_CONTROL_PORT     PORTB
        #define DISPLAY_CONTROL_DATADIR  DDRB
        #define DISPLAY_CONTROL_INPORT   PINB
        #define DISPLAY_SIGNAL_BUSY      PB4
        #define DISPLAY_SIGNAL_CS        PB0
        #define DISPLAY_SIGNAL_TINT      PB5

    #elif (ARCH == ARCH_XMEGA)



mit dem Atmega128 hat das so wunderbar funktioniert
 
Hast du das Projekt neu erstellt?

Ich gehe davon aus, dass du in den projekteinstellungen den richtigen Mikrocontroller ATmega2560 ausgewählt hast

Hast du F_CPU definiert? Am besten global in den Projekteinstellungen.
 
Hast du das Projekt neu erstellt?

Ich gehe davon aus, dass du in den projekteinstellungen den richtigen Mikrocontroller ATmega2560 ausgewählt hast

Hast du F_CPU definiert? Am besten global in den Projekteinstellungen.

nein, hab das projekt nicht neu erstellt, hab das alte genommen. Es ändert sich ja eigentlich auch nichts, außer dass ich den Atmeg2560 eingestellt hab.
Die F_CPU ist ja auch schon definiert mit 16Mhz.



Hab gestern Abend die Displayports auf PORTL gelegt - jetzt gehts :confused:
Entweder war gestern an PORTB irgendwie was verdreht - was eigentlich nicht sein kann, ich habs x-mal kontrolliert -

Ich werds evtl. heute nochmal umlöten und ausprobiern....
 
Hi,

ahhhhhhhhhhh.. fuck...

es geht... :D

-.-

naja.. hab immer nur mitm schieber 125khz ausgewählt.....
wenn ich 100khz genau einstell, dann gehts... ziemlich pingelig ^^

Da der interne Quarzoszillator eine relativ hohe Toleranz hat kann es sein das er genau in der falschen Richtung die Toleranz besitzt und du dann ein klein wenig zu schnell mit dem ISP-Takt bist.

Bei nem Mega8 hatte ich es schonmal das er ab und zu ging und ab und zu nicht. Da war ich genau an der Grenze.

Ich stell beim ersten mal auf eine recht kleine ISP-Frequenz mit der ich auf jeden Fall im sicheren Bereich bin. Damit stell ich dann den Systemtakt erstmal auf externen 16MHz Quarz um und danach kann ich dann mit 2MHz ISP loslegen :cool:

Gruß
Dino
 
Hab gestern Abend die Displayports auf PORTL gelegt - jetzt gehts :confused:

Du meinst die Control-Pins, hmmm komisch.

An PB1, PB2 und PB3 (ISP) hängt auch der Progammer, die verwendeten Steuer-Pins auf PortB sind sonst nicht irgendwie belegt, sollte also funktioneiren.

Schematic MEGA2560-USB.pdf

Ansonsten auch immer drauf achten, dass die Leitungen nicht allzu lang sind und auch keine Schleifen bilden.

Dirk :ciao:

---

Off-topic: Für die Mikrocontrollermodule haben wir nun auch Bootloader in Verbindung mit der Windows-Software Nano Development-Manager. Die Bootloader werden noch auf die Webpage gestellt, so dass man sich diese selbst programmieren kann.
 
ja, ich hab die ISP-Pins verendet, wollte eigentlich auch mit Hardware SPI fahren....
aber irgendwie ging das nicht - sonst hängt /hing auf diesen Pins nichts....
 
Hier noch mein ADC Problem....

ich möchte den ADC auto triggern, also Timer1 läuft, jede sekunde springt er mir in den ISR.
Und dann soll auch die ADC-Messunge angestroße werden,....

Hab den ADC auf Timer/Counter1 Compare Match B gesetzt. Nur, kann ich das so machen ?


Im Prinzip als so wie hier:
http://www.avr-praxis.de/forum/showthread.php?1583-Int0-gt-ADC-triggern





Code:
void init_adc()
{
	ADMUX = 0x00;
	ADMUX  |= (0<<REFS1)|(1<<REFS0); 
	ADCSRA |= ( (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2) );
	ADCSRA |= (1 << ADSC);
	ADCSRA |= (1 << ADIE);
	ADCSRA |= (1 << ADEN);
	
	
		
	ADCSRA |= (1 << ADATE);
	
	
	ADCSRB |= (1<<ADTS0) |(1<<ADTS2);  //Timer/Counter1 Compare Match B
	DIDR0 =0;
	
	
	sei();                            // Set the I-bit in SREG
	ADCSRA |= (1<<ADSC);              // Start the first conversion
	while(ADCSRA &(1<<ADSC))
	{
		;
	}
	volatile uint16_t dummy = 0;
	dummy = ADC;
	cli();
	
	
}
Interrupt wird im main wieder freigeschaltet



Code:
void timer1_init(void)
{
	TCCR1A = 0;     // set entire TCCR1A register to 0
	TCCR1B = 0;     // same for TCCR1B
	// set compare match register to desired timer count:
	OCR1A = 15624;	
	
	// turn on CTC mode 
	TCCR1B |= (1 << WGM12); 
	// Set CS10 and CS12 bits for 1024 prescaler:
	TCCR1B |= (1 << CS10);
	TCCR1B |= (1 << CS12);
	// enable timer compare interrupt:
	TIMSK1 |= (1 << OCIE1A);
	
}





Code:
ISR(ADC_vect)
{
	
	   adc_val += ADC;                   //wert lesen //  adc_val  als volatile deklariert
	   TIFR1 |= (1<<OCF1A);            // Clear the Timer 1 interruptflag - ist das richtig?
}




Das klappt: - Kanäle werden umgeschaltet
Code:
 ISR( TIMER1_COMPA_vect )       // every 1s
{

// Kanalumschaltung.... und zwar Eingäge umschalten per Portexpander - nicht die MUX! - da Potenzialfrei gemessen werden soll
	
	
}
 
ich möchte den ADC auto triggern, also Timer1 läuft, jede sekunde springt er mir in den ISR.
Und dann soll auch die ADC-Messunge angestroße werden, aber irgendwie klappt das icht so ....

Meine andere Idee war, im Timer-ISR, eine ADC-Messung zu starten (adc dann als Single conversion) - das hat irgendwie auch nicht gefunzt // kann wohl auch nicht gehen? ^^

Im Prinzip als so wie hier:
http://www.avr-praxis.de/forum/showthread.php?1583-Int0-gt-ADC-triggern

Du kannst auch von einer ISR eine ADC-Wandlung starten. Übrigends löscht eine ISR ihr Anforderungsflag immer selber, das musst du also nicht manuell machen.

So wie ich es aus deinen Code-Stücken heraus lese, möchtest du
- einmal in der Sekunde Messungen starten, aus diesen wird dann ein Mittelwert gebildet
- den Multiplexer des ADC Moduls nutzt du nicht, sondern einen externen.
- im Hauptprogramm möchtest du dann das Ergebnis weiter verarbeiten.

Du könntest hier eventuell so vorgehen:
(1) Timer ISR (alle 1s)
- initialisiert Zähler für Mittelwertbildung (Messzeit für alle Messungen für den Mittelwert muss kleiner 1 Sekunde sein)
- schaltet externen Multiplexer
- startet ADC Messung (der ADC Interrupt aktivieren, FreeRunning Mode aktiviert, ADC Interrupt triggert den ADC)


(2) ADC Interrurpt
- Messung solange summieren, bis Anzahl (zB 16) für Mittelwertbildung erreicht ist.
- Ist Anzahl erreicht, FreeRunning abschalten, ADC Interrupt deaktivieren, Mittelwert bilden (/16, geht schnell mit 4 mal rechts shift). Das Ergebnis in einer weiteren Variablen merken und Signal an das Hauptprogramm, was dieses pollt.

(3) Hauptprogramm
- pollt das Signal vom ADC Interrupt für fertige Messung. Wenn gesetzt, löschen und Ergebnis verarbeiten.


Beim nächten mal erstelle am besten ein neues Thema, damit der Thementitel passt. So könnten andere User besser helfen und User die nach einer Problemlösung suchen, finden sich besser zurecht.

Ich habe gesehen, du hast deinen Beitrag geändert, während ich am Schreiben war. Mach es bitte mit "EDIT:", damit man sieht, was sich geändert hat.

Es ist eigentlich egal, ob du einen CompareInterrupt oder einen OverflowInterrupt eines Timers verwendest, Hauptsache du kommst auf 1 Sekunde. Falls der Timer zu schnell läuft bzw das Event zu oft kommt, kannst du in der TimerISR einen Zähler einbauen. Zur Timerberchnung haben wir ein kleines Tool, was dir eventuell ein bisschen bei der Berechnung des Comparewertes oder des Nachladewertes hilft.

Dirk :ciao:
 
Eigentlich möchte ich es anderst haben...

und zwar, soll die ADC-Messung quasi autark nur über interrupts laufen.
also -> ADC automatisch Trigger...wobei sekündlich der Eingang umgeschaltet wird.

D.h. ,
-Timer läuft im CTC Modus (1s)
-Wenn er in ISR springt, wähle Kanal //bis hier hin klappt auch schon alles
-> ADC-Messung soll beginnen (das ist mein Knackpunkt)
-ADC-Interrupt: 16 Messungen, und bildet Mittelwert und schreibt Ergebnis in nen Ringbuffer
(Das ADC-interrupt muss logischerweise kürzer sein als 1 s)




---------------------------------------------------

so, jetzt hab ich gesehn, es ist möglich:
Atmeg2560 / Seite 293

Bit 2:0 – ADTS2:0: ADC Auto Trigger Source

ADTS2 ADTS1 ADTS0 Trigger Source
1 0 1 Timer/Counter1 Compare Match B


Das heißt, es muss irgendwie gehn, wenn ich den Timer in CTC laufen hab, dass bei erreichen des Compare-Wertes eine ADC-Messung gemacht wird?
Oder lieg ich da falsch?

und - das gilt für Compare Match B - also aber mein Compare wert steht ja im OCR1A......


EDIT:

Denkfehler?
muss ich die kanalumschaltung im ADC ISR machen?

- im Main lese ich nur die Ergebniss vom Ringbuffer aus
 
Das heißt, es muss irgendwie gehn, wenn ich den Timer in CTC laufen hab, dass bei erreichen des Compare-Wertes eine ADC-Messung gemacht wird?
Oder lieg ich da falsch?

und - das gilt für Compare Match B - also aber mein Compare wert steht ja im OCR1A......


Ja du kannst unterschiedliche Trigger-Events einstellen, nach Reset ist der ADC ISR automatisch als Trigger-Event eingestellt. Das heißt, wenn du hier nichts anderes wählst und den FreeRunningMode einstellst, wird der ADC sofort wieder gestartet, wenn eine Messung fertig ist (wenn also das Bit ADIF gesetzt ist). Jetzt kannst du auch einen anderen Event zum Beispiel der vom Timer, den OutputCompareB auswählen, der eine neue Wandlung startet.

Eine Mittelwertbildung dauert also 16 x 1 Sekunde = 16 Sekunden.

ADC-Interrupt:
- summiert einfach nur
- nach 16 mal summieren, Mittelwert bilden und in FIFO

OutputCompareB Interrupt:
- schaltet ext. Multiplexer um (macht das Sinn? Es wird ja für jede einzelne Messung ein anderer Kanal ausgewählt und die unterschiedlichen Messungen summiert und der Mittelwert gebildet)
- ADC wird automatisch gestartet, wenn als Triggerquelle der Interrupt eingestellt ist (beachten must du, dass schon gestartet wird bei gesetztem Interruptanforderungsflag, in der ISR stellst du dann den Multiplexer um. Eventuell stellst du besser den Multiplexer in der ADC ISR um.
 

Ü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)