-
Thread
Digitale Temperatursensoren mit 15m Kabel
nicht mit parasite, sondern externer Power zu arbeiten. Es geht auch mit analogen Sensoren, z.B. TMP36, die geben eine zur Temp. proportionale Spannung aus. Aber auch mit ganz billigen NTCs am ADC und einer kleinen LookUp-Table kann man recht schön messen.
-
Thread
avr-gcc->Probleme beim 1.kopieren von struct und 2. Arrays mit Double
folgende Probleme: 1. Der Zuweisung-Operator "=" bei Strukturen funktioniert nicht. Bsp.: struct_x tmp_struct_x; struct_x array_y[0] = tmp_struct_x; Der Inhalt von array_y[0] ist 0. Falls ich die einzelnen Elemente zuweise (array_y[0].a = tmp_struct_x.a), funktioniert das Ganze bzw. falls ich alternativ
perfekt!) 2. Beim folgenden Double Array: double x_Array[15] = {0, 0.05, 0.11, 0.17, 0.23, 0.36, 0.43, ... wird bei lesen bis Index 5 (0.36) eine 0 gelesen ab Index 6 (0.43) der entsprechende Wert. Was kann die Ursache sein? Umgebung: Linux. Ziel: atmega168p Avr-gcc: 4.1.2. Einstellungen
-
Thread
avr-gcc: 3.4.6 contra 4.3.0
4.3.0 ähnlich) [avrasm] .file "foo.c" __SREG__ = 0x3f __SP_H__ = 0x3e __SP_L__ = 0x3d __tmp_reg__ = 0 __zero_reg__ = 1 .global __do_copy_data .global __do_clear_bss ; GNU C version 4.2.2 (WinAVR 20071221) (avr) ; compiled by GNU C version 4.2.1-dw2 (mingw32-2). ; GGC heuristics
1: lsr r25 ; D.1505 ror r24 ; D.1505 dec r18 ; brne 1b andi r24,lo8(1) ; tmp47, ; 14 andqi3/2 [length = 1] ldi r25,lo8(0) ; <result>, ; 36 *movqi/2 [length = 1] /* epilogue: frame size=0 */ ret /* epilogue end (size=1) */ /* function foo size 10 (9) */
-
Thread
my AVR+LCD Problem
char data) { // aktuelles RS ermitteln char rs=PORTD; rs&=4; // High-Teil senden char tmp=data; tmp&=0xf0; tmp|=rs; PORTD=tmp; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); // Low-Teil senden tmp=data; tmp&=0x0f; tmp*=16; tmp|=rs; PORTD=tmp; // Schreibsignal
nach Bit 6 bringen col--; // Null-basierend col&=0x0f; // sicherheitshalber char tmp=row|col; tmp|=0x80; // Cursor setzen lcd_cmd(tmp); // senden } //--------------------------------------------------------------------------- // lcd_init(..) - Schaltet die Ports und
-
Thread
XOR / pointer - Problem
push r29 in r28,__SP_L__ in r29,__SP_H__ sbiw r28,9 in __tmp_reg__,__SREG__ cli out __SP_H__,r29 out __SREG__,__tmp_reg__ out __SP_L__,r28 /* prologue end (size=12) */ movw r26,r24 movw r18,r28 subi
adiw r26,1 rjmp .L3 .L9: /* epilogue: frame size=9 */ adiw r28,9 in __tmp_reg__,__SREG__ cli out __SP_H__,r29 out __SREG__,__tmp_reg__ out __SP_L__,r28 pop r29 pop r28 pop r17 pop r16 ret /*
-
Thread
Sensor AD590
Einfacher wäre es, einen Sensor mit Spannungsoutput zu nehmen. Z.B. TMP35/36/37, auch von Analog.
-
Thread
Akkus regenerieren (NiMH)
schaut es allerdings nicht so gut aus, hat sich nicht großartig verändert. http://www.jfuhlemann.de/tmp/volts2.png http://www.jfuhlemann.de/tmp/current2.png - Entladestrom in A http://www.jfuhlemann.de/tmp/restistance2.png x ist entnommene Strommenge in mAh. Bei 200 hab ich die Schwellspannung auf
nicht viel - etwas über 3.5A. http://www.jfuhlemann.de/tmp/volts2_3.png http://www.jfuhlemann.de/tmp/current2_3.png Hier sieht's gemischt aus. Die Spannung ist anfangs etwas niedriger, im späteren Verlauf hat der Akku im 2. Zyklus aber etwas mehr hergegeben
-
Thread
CRC-16: Ergebnis der Summenbildung
0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x0f78}; Die eigtl. Bildung geschieht mit folgender Codezeile: crc = (crc >> 8) ^ crc16_table[tmp ^ (crc & 0xff)]; Hat jemand eine Anmerkung für mich. DANKE. Gibts vielleicht sogar eine Freeware, wo ich solche Daten testen kann? Nochmal DANKE.
-
Thread
char in Float-Wert umwanden und auf LCD ausgeben
34; char ADC_Wert = 0x60; temp = NULL_Temp + (float)ADC_Wert * 0.025; in temp steht jetzt 36.4 drin! dann hab ich noch ausprobiet das ergebniss in eine andere Variable zu scheiben und dann auszugeben: float temper; temper = temp; printf ("Temperatur %.2f °C", temp); doch leider
Die Temp. wird über einen Sensor über I2C gemessen. (TMP100 von Texas Instruments) Der besitzt 9- bis 12-Bits für die Ausgabe, wobei ich nicht genau weiß wie ich die einstelle. Bei 12bit - Ich glaube das ist standardmäßig eingestellt - ist die Schrittweite
-
Thread
AVR-Bootloader mit Verschlüsselung
AVRootloader.inc" ;.listmac .list .org BootStart init: cli ;----------------------------- .def tmp = r28 .def tmp1 = r29 ldi tmp, $00 out DDRA, tmp ;PORTA als Eingang ldi tmp, 0b11111100 out PORTA, tmp ;PullUp in tmp, PINA andi tmp, 0b10001000 ldi tmp1, 0b10001000 eor tmp, Tmp1 ldi tmp1, 0 cpi tmp, 0b10001000 brne NoButtons ldi tmp1, 1 ;wenn gedruckt, immer auf PC warten (tmp1=1) NoButtons: ;
-
Thread
Geschwindigkeitsberechnung in Assembler
5 RP1 EQU 6 t EQU 0x24 v EQU 0x25 C1cnt EQU 0x20 C2tmp EQU 0x21 C3rem EQU 0x23 GOTO main main MOVLW .200 BCF 0x03,RP0 BCF 0x03,RP1 MOVWF C2tmp CLRF C3rem MOVLW .8 MOVWF C1cnt m001 BCF 0x03,
durch andere Operationen mit ganzen Zahlen ersetzen könnte. 3,6 ist schließlich nichts anderes als 36/10, also sollte das ganze ziemlich unproblematisch sein...
-
Thread
Inline Assembler- Bits spiegeln
etwa das raus: ;->R16: zu spiegelndes Byte ;<-R16: gespiegeltes Byte MirrorBits: push tmp ; 2 bst R16,0 ; 1 bld tmp,7 ; 1 bst R16,1 ; 1 bld tmp,6 ; 1 bst R16,2 ; 1 bld tmp,5 ; 1 bst R16,3 ; 1 bld tmp,4 ; 1 bst R16,4 ; 1 bld tmp,3 ; 1 bst R16,5 ; 1 bld tmp,2 ; 1 bst R16,6 ; 1 bld tmp,1 ; 1 bst R16,7 ; 1 bld tmp,0 ; 1 mov R16,tmp ; 1 pop tmp ; 2 ret ; 4
-
Thread
RF12 funktioniert bei timerinterrupts nicht mehr
every 100ms } // end endlesloop // Über funk empfangen void receive(void) { uint8_t tmp_sreg; tmp_sreg = SREG; //cli(); // Empfangen if(rf12_rxdata(test)) { LED1_TOG; // über Uart ausgeben uart_puts((char*)test); // Pause for(long
*****************************/ unsigned long Gettime (void) { return ((timebase * 256) + count36kHz) / 36; } [/c]
-
Thread
MSP430F1612_2 Timer_2 Zeitbasen
User-Guide Seite 4-7 müssten das dann ca. 8MHz sein. Aber im Datenblatt zum F1612 steht auf Seite 36 für RSEL = 7, DCO = 7, MOD = 0 und DCOR = 0; bei 3V knapp 5MHz. Ja, was denn nun? Meint Ihr, dass könnte SO gehen? Vcc ist bei mir übrigens 3,3V. [c] DCOCTL = DCO0 + DCO1 + DCO2;
soll... >Wo schreib ich jetzt meine globalen Variablen rein? [c] // my_globals.c uint8_t my_tmp; [/c] [c] // my_globals.h extern uint8_t my_tmp; [/c] my_globals.h wird dann überall per #include eingebunden. Sieht aus wie doppelt gemoppelt, ist aber schon sinnvoll. MFG Falk
-
Thread
2 mal Uart beim Mega8
{ u8 in = SRXPIN; // scan rx line if( srx_mask ){ if( in & 1<<SRX ) srx_tmp |= srx_mask; srx_mask <<= 1; OCR1B += BIT_TIME; // next bit slice }else{ srx_done = 1; // mark rx data valid srx_data = srx_tmp; // store rx data TIFR = 1<
OSCCAL=0x31; sfrb TCNT0=0x32; sfrb TCCR0=0x33; sfrb MCUCSR=0x34; sfrb MCUCR=0x35; sfrb TWCR=0x36; sfrb SPMCR=0x37; sfrb TIFR=0x38; sfrb TIMSK=0x39; sfrb GIFR=0x3a; sfrb GICR=0x3b; sfrb SPL=0x3d; sfrb SPH=0x3e; sfrb SREG=0x3f; [/c] lg
-
Thread
Frage zur C Syntax
// select ftw function #if (sel==0) uint32_t ftw_fix_1 (uint32_t freq) { uint64_t tmp; tmp = freq * ACCU_SIZE / F_DDS; return tmp; } #endif #if (sel==1) uint32_t ftw_fix_2 (uint32_t freq) { uint64_t tmp; // tmp = freq * ACCU_SIZE * 2^25 / F_DDS / 2^25; // ACCU_SIZE / F_DDS = 107,3741824 // ACCU_SIZE * 2^25 / F_DDS = 3602879702 tmp = freq * 3602879702ULL; tmp >>= 25; return tmp; } #endif #if (sel==2) uint32_t ftw_float_1 (uint32_t freq) { float tmp; tmp = (float)freq * ACCU_SIZE / F_DDS; return tmp;
-
Thread
Webserver ATmega32/644DIP ENC28J60
schinden: void enc28j60_send_packet(unsigned int len, unsigned char *buffer) { unsigned int tmp; //still sending ? //wait max 50*10 = 500ms: for(tmp=0; tmp<500; tmp++){ if (!(enc28j60_read_address(ENC28J60_REG_ECON1) & (1<<ENC28J60_BIT_TXRTS))){ //send finished -> tx packet
zum Test ganz Primitiv eingebunden: [c]if(strcasestr_P((char*)ð_buffer[a],PSTR("LED3=3"))!=0){tmp |=(1<<PA2);} if(strcasestr_P((char*)ð_buffer[a],PSTR("LED4=4"))!=0){tmp |=(1<<PA3);} if(strcasestr_P((char*)ð_buffer[a],PSTR("LED5=5"))!=0){tmp |=(1<<PA4);} if
-
Thread
PC => µC Daten senden um I/0 zu steuern
Du bekommst zwei ASCII Zeichen: '6' (0x36) und '3' (0x33) Die baust du so zusammen zu einem Bin Wert: tmp = (('6' - '0') <<4 ) + ('3' - '0');
>Die baust du so zusammen zu einem Bin Wert: >tmp = (('6' - '0') <<4 ) + ('3' - '0'); Ach Quatsch, ist schon so spät ;) tmp = (('6' - '0') * 10 ) + ('3' - '0'); Gute Nacht !
-
Thread
Windows und Linux lesen SD Karte falsch
unsigned char test[512]; for (int i=0;i<sizeof(test);i++) { test[i]=0; } unsigned int tmp; mmc_read_csd (Buffer); //Ausgabe des Root Directory unsigned int Clustervar; unsigned char Dir_Attrib = 0; unsigned long Size = 0; for (char a = 1;a < 240;a++) { Clustervar
&Size,&Dir_Attrib,Buffer); if (Clustervar == 0xffff) { break; } tmp = (Size & 0x0000FFFF); } Clustervar = 0;//suche im Root Verzeichnis printf("FERTIG!!\n"); strcpy((char*)test,"0123456,2546,1256,1544,15454,254584,1254,2412,54"); { if (fat_search_file
-
Thread
UART Bootloader ATtiny13 - ATmega644
isAnswerArrived) { if (answer[0] == BL_BADCOMMAND) { return CRC_STATUS.NO_CRC; } } int tmpCrc = crc; System.out.println(Integer.toHexString(tmpCrc)); send(tmpCrc & 0xff); send(tmpCrc >> 8); waitForAnswer(); i = answer[0]; switch (i) { case BL_SUCCESS: return
CRC_STATUS.CRC_OK; default: return CRC_STATUS.CRC_FAIL; } } private void get_crc(int d) { int tmpCrc = crc ^ d; for (int i = 0; i<8; i++) { if ((tmpCrc & 0x1) != 0) { tmpCrc = (tmpCrc >> 1) ^ 0xA001; } else { tmpCrc = tmpCrc >> 1; } } crc = tmpCrc
-
Thread
genaue Temperaturmessung mit ds1820
Single Dim Id1(8) As Byte Dim Id2(8) As Byte Dim Ar1(9) As Byte Dim Ar2(9) As Byte Dim I As Byte , Tmp As Byte , Tmp2 As Byte Dim Crc As Byte Dim W As Byte Declare Sub Crcit Declare Sub Crcit2 W = 1wirecount() Id1(1) = 1wsearchfirst() '
Temperatur T5: " ; T5 ; "°C" Waitms 500 Loop Sub Crcit Crc = 0 For I = 1 To 9 Tmp = Crc Xor Ar1(i) Crc = Lookup(tmp , Crc8) Next End Sub Sub Crcit2 Crc = 0 For I = 1 To 9 Tmp2 = Crc Xor Ar2(i) Crc = Lookup(tmp2 , Crc8) Next End Sub '//
-
Thread
GCC: Sehr langes C-Programm für Zielsystem PC
ist etwas größer: chef@localhost /tmp/xyz $ ls -lah gcd.o -rw-r--r-- 1 chef chef 13M Jun 29 01:27 gcd.o Dafür spuckt der Linker ein paar Fehler aus: chef@localhost /tmp/xyz $ gcc -o gcd gcd.o 2>&1 gcd.o: In function `main': gcd.c
/tmp $ date && ./gcd && date Fri Jun 29 20:45:38 CEST 2007 3.456838e+02 Fri Jun 29 20:45:38 CEST 2007 chef@localhost /tmp $
-
Thread
bidirektionale RS232 Funkbrücke mit RFM12
: Meine Version der Baudratenfunktion: [c] void rfmSetBaud( uint16_t baud ) { uint16_t tmp; //minimal baudrate with cs=0 is about 2700 if( baud < 2700 ) { tmp = (344828/(baud*8)-1); //cs=1 BR=344828/(R+1)*(1xcs*7) } else { tmp = ((344828/baud)-1); //cs=0 BR=344828/(R+1) } rfmWrtCmd(0xC600|tmp); } [/c]
-
Thread
AVR-GCC Deoptimierung
in r29,__SP_H__ 42 0008 2297 sbiw r28,2 43 000a 0FB6 in __tmp_reg__,__SREG__ 44 000c F894 cli 45 000e DEBF out __SP_H__,r29 46 0010 0FBE out __SREG__,__tmp_reg__ 47 0012 CDBF out __SP_L__,r28 48
epilogue: frame size=2 */ 59 0020 2296 adiw r28,2 60 0022 0FB6 in __tmp_reg__,__SREG__ 61 0024 F894 cli 62 0026 DEBF out __SP_H__,r29 63 0028 0FBE out __SREG__,__tmp_reg__ 64 002a CDBF out __SP_L__,r28 65 002c
-
Thread
Beispielprogramm für RFM12 433MHz Funk-Module
der C Code für den Empfänger: [c] void receive(void) { unsigned char test[1]; uint8_t tmp; rf12_rxdata(test,1); tmp = atoi(test[0]); if(tmp > 0 && tmp < 10) { einer = tmp; } } [/c] Beim Build bekomme ich diese Warnung: [c] ../main.c:106: warning: implicit
Richard B. wrote: > Hier der C Code für den Empfänger: > tmp = atoi(test[0]); atoi nimmt char* als Argument, Du gibt ihm hier aber nur ein char. So wäre es richtig: tmp = atoi(test); Dann mußt Du allerdings auch sicherstellen, daß der String mit
-
Thread
LCD-Ansteuerung funktioniert nicht
char data) { //Aktuelles RS ermitteln char rs=PORTD; rs&=4; //High-Teil senden char tmp=data; tmp&=0xf0; tmp|=rs; PORTD=tmp; //Schreibsignal sbi(PORTD,3); cbi(PORTD,3); //Low-Teil senden tmp=data; tmp&=0x0f; tmp*=16; tmp|=rs; PORTD=tmp; //Schreibsignal
int col) { row--; row&=0x01; row*=40; col--; col&=0x0f; char tmp=row|col; tmp|=0x80; lcd_cmd(tmp); } //Backlight Funktion bool lcd_dimmer_is_init=false; void lcd_light(bool on_off) { //wenn dimmer an, dann PWM deinit if (lcd_dimmer_is_init)
-
Thread
RFM12 - Funkmodul
COMPARE A Interrupt ISR( TIMER1_COMPA_vect ) { static uint8_t pwm_cnt=0; uint8_t tmp=0; OCR1A += (uint16_t)T_PWM; if (pwm_setting[0] > pwm_cnt) tmp |= (1<<0); if (pwm_setting[1] > pwm_cnt) tmp |= (1<<1); if (pwm_setting[2] > pwm_cnt) tmp |= (1<<2); if (pwm_setting[3] > pwm_cnt) tmp |= (1<<3); if (pwm_setting[4] > pwm_cnt) tmp |= (1<<4); if (pwm_setting[5] > pwm_cnt) tmp |= (1<<5); if (pwm_setting[6] > pwm_cnt) tmp |= (1<<6); if (pwm_setting[7] > pwm_cnt) tmp
-
Thread
Schwerer Bug in AVR-GCC 4.1.1 Gesperrt
berechnen kann. (zwar nicht als Konstante, aber als Immediate). [avrasm] foo: ldi r24,lo8(48) ; tmp42, sts display,r24 ; <variable>.digit, tmp42 sts display+1,r24 ; <variable>.digit, tmp42 sts display+2,r24 ; <variable>.digit, tmp42 sts display+3,r24 ; <variable>.digit, tmp42
r31,hi8(display) ; dis, /* #APP */ ;RELOAD z with dis /* #NOAPP */ ldi r24,lo8(48) ; tmp42, st Z,r24 ; <variable>.digit, tmp42 std Z+1,r24 ; <variable>.digit, tmp42 std Z+2,r24 ; <variable>.digit, tmp42 std Z+3,r24 ; <variable>.digit, tmp42 ret [/avrasm] Mit