[Atmega32] Externes Quarz über Fuses aktivieren

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 27 12 2025  18:36:40      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Oszilloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte


Autor
[Atmega32] Externes Quarz über Fuses aktivieren
Suche nach: quarz (1388)

    







BID = 561831

pippo

Gesprächig



Beiträge: 183
ICQ Status  
 

  


Ich bin leider zu doof die Datenblätter zu verstehen und im Internet hab ich einfach nix passendes gefunden. Folgendes Problem: Ich hab einen Atmega32 mit einem externen Quarz (8 Mhz), das ich gern "aktivieren" möchte. Leider versteh ich nicht, was ich in AVR-Studio 4.13 (gcc) einstellen muss, damit dieser verwendet wird.

Wäre blöd, wenn ich mich aussperre, da der Atmega bereits fest verlötet ist.

BID = 561841

ElektroNicki

Inventar



Beiträge: 6424
Wohnort: Ugobangowangohousen

 

  

da jibbet doch den palmavr-fusebitrechner

_________________

BID = 561846

pippo

Gesprächig



Beiträge: 183
ICQ Status  

Da hab ich das gleiche Problem wie jetzt: ich weiß nicht was ich auswählen muss. Ich weiß ja nicht, wie man die Fuses sonst noch so einstellen kann, aber in AVR-Studio steh ich vor der gleichen Auswahl wie in dem Fusebitrechner.

Ich nehm an Ext. RC Osc ist schonmal richtig, aber was dann? 3-8 Mhz oder 8 - 12Mhz? Welche Startup-Time und wieviel ms ?

BID = 561850

DonComi

Inventar



Beiträge: 8604
Wohnort: Amerika

Es muss External Chrystal ausgewählt werden, und zwar der Bereich, in dem dein Quarz liegt.
Keine Ahnung, ob es dort diese Option gibt, so steht es in jedem Datenblatt... Wer lesen kann ist halt irgendwie im Vorteil.

_________________

BID = 561859

pippo

Gesprächig



Beiträge: 183
ICQ Status  

Stimmt, ja. Jetz steh ich aber vor der Auswahl low, medium und high-frequency. Dazu konnte ich im Datenblatt nichts finden. Ebenso wie man Delay und Start-up Time auswählt. Ich nimm mal an, mit den größten Werten fährt man am sichersten?

BID = 561939

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Normalerweise steht wirklich alles im Datenblatt.

Ich habe mir mal die Mühe gemacht und die Seite herrausgeschreiben:

Datenblatt Atmega32 Seite:22-28 dort müssten alle relevanten Daten zum einstellen der Fusebits stehen.




_________________
Mfg Rambodischien

BID = 561963

pippo

Gesprächig



Beiträge: 183
ICQ Status  

Danke, das hab ich schon alles gelesen. Das Problem ist ja, was versteht AVR-Studio unter Low, Medium und High. Hab jetzt einfach mal High-Frequency mit der größten Startup-Time genommen. Ich komm zumindest immer noch auf den uC drauf. Leider kommt über den USART immer noch nix raus, was ich mir dadurch erhofft hätte.

BID = 562000

Rambodischien

Schreibmaschine

Beiträge: 1341
Wohnort: Österreich

Kann es nicht sein, dass es am Programm liegt?

Oder anderst formuliert. Wie kommst du darauf,dass es an dem Clock liegt?


_________________
Mfg Rambodischien

BID = 562026

Jornbyte

Moderator



Beiträge: 7346

pippo es liegt an deinem Programm. Würde der Takt nicht stimmen und dadurch Fehler im Datenstrom der UART vorkommen, hättest du viele wirre Zeichen.

_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 562081

pippo

Gesprächig



Beiträge: 183
ICQ Status  

Ich denke nicht, dass es am Programm liegt. Denk eher an der Hardware stimmt was nicht. Werd nächste Woche mal ein Oszi hinhängen.

Das mit dem Quarz war so, dass ich gelesen hab, dass der USART ohne externen garnicht funktioniert. Ausserdem wollt ich ihn auch verwenden, wenn er schon auf der Platine sitzt

BID = 562100

Jornbyte

Moderator



Beiträge: 7346

Gegen den Oszi habe keine Einwände, Poste doch mal deine UART-Ansteuerung.

_________________
mfg Jornbyte

Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.

BID = 562252

DonComi

Inventar



Beiträge: 8604
Wohnort: Amerika

Sowas lässt sich einfach herausfinden: Schreibe eine Routine, die zyklische Signale erzeugt, z.b. jede Sekunde einen Pin umschaltet. Damit die Periodendauer wirklich 1s beträgt, muss das Programm auch entsprechend geschrieben sein, bei Nutzung eines Timers müssen z.B. korrekte Vorteilerwerte geschrieben werden oder im Falle von Warteschleifen Register mit bestimmten Zahlen geladen werden.

Die Grundlage, auf der diese Zahlen beruhen, ist unter anderem die Taktfrequenz. Berechnet man nun diese Verzögerungswerte für die Quarzfrequenz und stimmt die Periodendauer dann auch mit der gewünschten überein, ist die Taktquelle auch der Quarz. (Es sei denn, Quarz- und interne Frequenz sind annähernd gleich, dann bringt diese Methode nichts.)

Ansonsten halt mit dem Oszi schauen, ob der Quarz oszilliert. Ohne Oszi muss man halt nochmal das Datenblatt anschauen...

_________________

BID = 567926

pippo

Gesprächig



Beiträge: 183
ICQ Status  

So, konnte das ganze mal prüfen. Scheint so, als ob der UART nicht sendet.

Hier mal Auszugsweise der Code, mit dem ich es probiere:



Code :


#define BAUD_RATE 9600UL //Baud Rate für die serielle Schnittstelle
#define SYSCLK 8000000
#define UBRR_BAUD ((SYSCLK/(16UL*BAUD_RATE))-1)
#define USR UCSRA
#define UCR UCSRB
//#define UBRR UBRRL
...

#include <avr/io.h>
#include <stdint.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdbool.h>

int main() {

char pdu[PDU_MAX];

DDRA = (1 << DDB0);
DDRB = (1 << DDB0) | (1 << DDB1);


encoding_pdu(pdu, "HANDYNUMMER", "test-sms 123");
send_sms(pdu);


while(1) {
;
}

return 0;
}


void send_sms(char *pdu) {

uint8_t bytes=0;

//PORTA|=(1<<PA0); //Ausgangspin setzen

for(; *pdu!='[1code]
#define BAUD_RATE 9600UL //Baud Rate für die serielle Schnittstelle
#define SYSCLK 8000000
#define UBRR_BAUD ((SYSCLK/(16UL*BAUD_RATE))-1)
#define USR UCSRA
#define UCR UCSRB
//#define UBRR UBRRL
...

#include <avr/io.h>
#include <stdint.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdbool.h>

int main() {

char pdu[PDU_MAX];

DDRA = (1 << DDB0);
DDRB = (1 << DDB0) | (1 << DDB1);


encoding_pdu(pdu, "HANDYNUMMER", "test-sms 123");
send_sms(pdu);


while(1) {
;
}

return 0;
}


void send_sms(char *pdu) {

uint8_t bytes=0;

//PORTA|=(1<<PA0); //Ausgangspin setzen

for(; *pdu!='\0'; pdu++, bytes++) ; //Länge des PDU-Strings ohne SMSC bestimmen
bytes-=pdu[0];

initialize_handy();

uart_puts("AT+CVIB=0");

uart_puts("AT+CMGF=0");

uart_puts("AT+CMGS=");

uart_putc(bytes);

uart_puts(pdu);

uart_putc(0x1a);

}

void initialize_handy(void) {

UBRRH=0;
UBRRL=51;
//8N1 Daten
UCSRC|=0x86;
//Empfangen und Senden
UCSRB=0x18;

//Baudrate einstellen (Normaler Modus)
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

// Aktivieren von receiver und transmitter
UCSRB = (1<<RXEN)|(1<<TXEN);

// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

}


void uart_puts(char *string){

uint8_t i=0;

while (*string){ //solange bis ´\0´ das Ende markiert

while(!(USR & (1 << UDRE))) //warten, bis UDR bereit ist
// while ( !( UCSRA & (1<<UDRE)) );
// while(bit_is_clear(UCSRA,UDRE)); //warten auf Datenregister empty

UDR = *string;
string++;
i++;
if(i==10000) fault();
}
}


void uart_putc(char c){

while(!(USR & (1<<UDRE)));
// while ( !( UCSRA & (1<<UDRE)) );
//while(bit_is_clear(UCSRA,UDRE)); //warten auf Datenregister empty

UDR = c;
}
[/code1]'; pdu++, bytes++) ; //Länge des PDU-Strings ohne SMSC bestimmen
bytes-=pdu[0];

initialize_handy();

uart_puts("AT+CVIB=0");

uart_puts("AT+CMGF=0");

uart_puts("AT+CMGS=");

uart_putc(bytes);

uart_puts(pdu);

uart_putc(0x1a);

}

void initialize_handy(void) {

UBRRH=0;
UBRRL=51;
//8N1 Daten
UCSRC|=0x86;
//Empfangen und Senden
UCSRB=0x18;

//Baudrate einstellen (Normaler Modus)
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

// Aktivieren von receiver und transmitter
UCSRB = (1<<RXEN)|(1<<TXEN);

// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

}


void uart_puts(char *string){

uint8_t i=0;

while (*string){ //solange bis ´[1code]
#define BAUD_RATE 9600UL //Baud Rate für die serielle Schnittstelle
#define SYSCLK 8000000
#define UBRR_BAUD ((SYSCLK/(16UL*BAUD_RATE))-1)
#define USR UCSRA
#define UCR UCSRB
//#define UBRR UBRRL
...

#include <avr/io.h>
#include <stdint.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdbool.h>

int main() {

char pdu[PDU_MAX];

DDRA = (1 << DDB0);
DDRB = (1 << DDB0) | (1 << DDB1);


encoding_pdu(pdu, "HANDYNUMMER", "test-sms 123");
send_sms(pdu);


while(1) {
;
}

return 0;
}


void send_sms(char *pdu) {

uint8_t bytes=0;

//PORTA|=(1<<PA0); //Ausgangspin setzen

for(; *pdu!='\0'; pdu++, bytes++) ; //Länge des PDU-Strings ohne SMSC bestimmen
bytes-=pdu[0];

initialize_handy();

uart_puts("AT+CVIB=0");

uart_puts("AT+CMGF=0");

uart_puts("AT+CMGS=");

uart_putc(bytes);

uart_puts(pdu);

uart_putc(0x1a);

}

void initialize_handy(void) {

UBRRH=0;
UBRRL=51;
//8N1 Daten
UCSRC|=0x86;
//Empfangen und Senden
UCSRB=0x18;

//Baudrate einstellen (Normaler Modus)
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

// Aktivieren von receiver und transmitter
UCSRB = (1<<RXEN)|(1<<TXEN);

// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

}


void uart_puts(char *string){

uint8_t i=0;

while (*string){ //solange bis ´\0´ das Ende markiert

while(!(USR & (1 << UDRE))) //warten, bis UDR bereit ist
// while ( !( UCSRA & (1<<UDRE)) );
// while(bit_is_clear(UCSRA,UDRE)); //warten auf Datenregister empty

UDR = *string;
string++;
i++;
if(i==10000) fault();
}
}


void uart_putc(char c){

while(!(USR & (1<<UDRE)));
// while ( !( UCSRA & (1<<UDRE)) );
//while(bit_is_clear(UCSRA,UDRE)); //warten auf Datenregister empty

UDR = c;
}
[/code1]´ das Ende markiert

while(!(USR & (1 << UDRE))) //warten, bis UDR bereit ist
// while ( !( UCSRA & (1<<UDRE)) );
// while(bit_is_clear(UCSRA,UDRE)); //warten auf Datenregister empty

UDR = *string;
string++;
i++;
if(i==10000) fault();
}
}


void uart_putc(char c){

while(!(USR & (1<<UDRE)));
// while ( !( UCSRA & (1<<UDRE)) );
//while(bit_is_clear(UCSRA,UDRE)); //warten auf Datenregister empty

UDR = c;
}



So, damit experimentier ich immer bissal rum paar zeilen sind noch auskommentiert, die hab ich mal alternativ verwendet. Das meiste wurde aber schon rausgeschmissen


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 17 Beiträge im Durchschnitt pro Tag       heute wurden bisher 9 Beiträge verfasst
© x sparkkelsputz        Besucher : 187977730   Heute : 8042    Gestern : 28182    Online : 188        27.12.2025    18:36
10 Besucher in den letzten 60 Sekunden        alle 6.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0483810901642