| Autor |
[Atmega32] Externes Quarz über Fuses aktivieren Suche nach: quarz (1388) |
|
|
|
|
BID = 561831
pippo Gesprächig
  
Beiträge: 183
|
|
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
|
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
|
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
|
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
|
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
|
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
|