#avr | Logs for 2016-06-01

Back
[05:57:32] <GeneralStupid> oh my god -.-
[05:57:49] <GeneralStupid> in atmel studio 7, all the button images are not there anymore
[05:58:28] <twnqx> windows software \o/
[06:00:31] <GeneralStupid> i have to use that crap at work -.
[06:00:48] <GeneralStupid> and i have no administrator credentials so maybe i could not fix this
[06:03:44] <Lambda_Aurigae> eeww.
[06:04:26] <GeneralStupid> nice there is a fix
[06:04:41] <GeneralStupid> and i "just" need anyone who gives me admin permissions -.-
[06:04:48] <Lambda_Aurigae> install linux, vi, and avr-gcc toolchain?
[06:05:59] <GeneralStupid> Lambda_Aurigae: i have linux installed. a "brand new" debian 6 installation
[06:06:10] <GeneralStupid> but no root rights either
[06:06:46] <GeneralStupid> and i was told to use atmel studio, because it integrates evyrithin (asf) so nicely...
[06:07:09] <carabia> Given the similar problem over at linux, you'd face similar rights-issue
[06:07:44] <GeneralStupid> i just need to get admin/root rights, no matter what operating system i use.
[06:08:18] <carabia> Over at windows you just don't have to be dealing with the clusterfucked million-devs (half of them pimplefaced freshmen outta university, or similar know-it-alls, interested in maintaining a project for X amount of time) -bs
[06:08:27] <GeneralStupid> iam paid for working time and for me, waiting for permission, is working time. So ill get myself a coffee :D
[06:09:25] <GeneralStupid> asf integration in atmel studio is really nice, but i see no simple way to export this project to linux (Makefile or smthg)
[06:09:42] <GeneralStupid> But asf is really fucked up :)
[06:10:39] <GeneralStupid> documentation is "ok" but not really much so you end up in debugging their code and you dont see the endless recursion because of the goto's they use...
[06:12:43] <carabia> You can kinda pick the stuff off the existing asf-shittery to fit your needs...
[07:40:24] <Tom_itx> zlog
[08:45:56] <_ami_> i installed Atmel studio today and it broke my existing visual studio
[08:46:00] <_ami_> WTF!
[08:47:12] <Haohmaru> surprise surprise
[08:49:25] <GeneralStupid> No! Atmel Studio, that great piece of software?
[08:49:54] <GeneralStupid> i shouldnt say that but... Probably hardware developers should stop to develop software :D
[09:55:51] <lowin> Setting GICR |= _BV(6) makes my mcu to keep resetting. But I did define a ISR for int0 vector and I can confirm it does run. What could be the problem?
[10:54:52] <gjm> god
[10:55:04] <Thrashbarg> who?
[10:56:52] <gjm> ¯\_(ツ)_/¯
[11:02:20] <lowin> gjm, Are you with me? Why god hates me? :(
[11:05:39] <lowin> So for now I realized that shorting out my 2.2k pull up resistor doesn't trigger a reset anymore
[11:06:00] <lowin> I have no idea why
[11:12:48] <Mr_Sheesh> uh lowin usually reset is pulling that pin low isn't it?
[11:13:56] <lowin> Mr_Sheesh, No that resistor wasn't connected to reset. I have a 10k ohm pull up on reset pin.
[11:14:30] <Mr_Sheesh> Oh OK, just that /MClr works that way. IDK your board :)
[11:14:56] <lowin> I just realized that shorting that resistor made it impossible for external interrupt to happen.
[11:15:13] <lowin> So now I know something on my ISR is triggering the resets
[11:45:32] <lowin> caught the culprit.. nasty little thing. trying to ld from address 0x19 (pinA) crashed the mcu
[11:45:44] <lowin> how many wasted hours -.-
[11:48:42] <theBear> 3
[11:49:35] <lowin> That's #avr's wasted hours on me. I've been busy on this crap since 2 days ago :(
[11:51:48] <theBear> you wasted hours on it !~ and it can never take that away from you, err, again
[12:46:01] <DKordic`> lowin: What do You mean``ld from address 0x19 (pinA) crashed the mcu''? AFAIK PINA should be 0x20. `ld R_ , 0x19' = `ld R_ , 25' almost `nop ; mov R_ , R25'. AFAIK Reserved SFRs just read as 0, and writes are ignored.
[12:46:44] <NicoHood> I used an ISR to detect a pin interrupt. INT0_vect. The first instruction takes 13ms to be executed after the pin falls. Is this normal? I expected just a few us
[12:47:38] <lowin> DKordic`, You are right actually, it was loading address 0x19 which crashed it. I think it maps to r25 not pina. Doesn't matter because changing that fixed it
[12:47:39] <DKordic`> lowin: Maybe BOR occured?
[12:48:10] <DKordic`> NicoHood: Can You please provide more detail, just in case?
[12:48:59] <DKordic`> NicoHood: What is the Instruction Cycle Period?
[12:49:19] <NicoHood> I used a logic analyzer to check when the line goes low (on INT0). And in the ISR i used PORTD |= 1<<3 to check when the ISR is executed
[12:49:35] <NicoHood> and between the falling and the rising of the other pin is 13ms. 16mhz
[12:50:12] <lowin> No I specifically checked all mcucsr bits, defined a custom badisr vector and everything. there was no indication of why it was failing
[12:50:55] <NicoHood> even with all c push and pops you will never read 13ms.
[12:51:52] <NicoHood> so is it normal that the INT0 is calling too late?
[12:55:51] <NicoHood> I used a normal wire to trigger the pin. now i tried to manuall trigger the pin from the avr itself and i got 1.5 us which is way better
[12:56:07] <NicoHood> but still "too slow" for my usecase
[12:56:59] <NicoHood> sometimes i get 1us and sometimes 1.5 us
[12:57:17] <NicoHood> but almost exactly 1.5 and 1.0
[13:00:02] <NicoHood> with a higher resolution it seems to be about 1.25 us which sounds better now
[13:08:46] <NicoHood> what the hell is gcc doing here? https://gist.github.com/NicoHood/fe80c551d37f7f5a93cc8d6fdaf808a7
[15:27:33] <bss36504> Is there a way to connect the analog comparator's output directly to a pin without software?
[15:28:17] <LeoNerd> Not on most AVR chips
[15:28:20] <LeoNerd> Some have an ACOUT pin
[15:29:01] <bss36504> What would be nice is if they had a programmable DAC input to the AC plus the ACOUT pin, but I assume that doesn't exist
[15:31:29] <LeoNerd> Well, digital MCUs don't tend to have a lot of analog hardware.. if you wanted fancier analog stuff you might need to do that off-chip
[15:32:16] <bss36504> Just trying to accomplish some integration. However, the Xmega16A4U looks like it will fit the bill. Onboard DAC, onboard AC with ACOUT pin
[15:33:09] <bss36504> Oh snap actually you can pipe the DAC output into the AC on this chip. neato.
[15:33:35] <LeoNerd> :)
[15:34:45] <bss36504> Need a reflow oven, thought I'd do something fun and use phase angle control to drive the SSRs. Maybe it's overkill, but I figure if I can get the phase control hardware as tightly integrated into the micro as possible, it will save me board space and complexity.
[16:08:58] <kre10s_> bss36504, I use triacs + optocopler zero crossing detector to control my oven.
[16:12:11] <bss36504> How do you control the firing angle?
[16:12:21] <kre10s_> reliable zero crossing detection is a pain in the ass, so what I did was use an optocopler with two diodes. instead of a single zero crossing flank I get a flank before and after zero. a pin change interrupt and a timer are used to calculate true zero, and desired time to trigger the triac.
[16:13:51] <bss36504> Oh I see. Yeah I was just gonna full wave rectify the AC, run it through a voltage divider (not necessarily in that order), connect it to one of the pins on the AC, the other AC pin goes to the DAC output. ACOUT goes to SSR. Now I can adjust my switching threshold with the DAC.
[16:13:52] <kre10s_> I used the on chip 8Mhz crystal and some prescaler i don't remember. just something that will get the 16bit timer to cover 2*1/50Hz with some headroom
[16:14:56] <kre10s_> hehe. yea thats a cool idea.
[16:15:37] <bss36504> Thanks :) I know it's maybe not the simplest, but my external components are cheap and easy, and it's cool to use non-cpu related resources in the micro to do actually constructive things
[16:17:55] <kre10s_> The trick with the timer and calculating the actual zero crossing is that you don't need a precise voltage reference, you just need to be symmetric around zero crossing.
[16:19:45] <bss36504> That is true. So once you determined zero, you just waited a little bit and then fired your SSR control signal I assume?
[16:20:10] <bss36504> "A little bit" equating to whatever firing angle you wanted
[16:20:56] <bss36504> How did you go about computing a linear percentage to a sinusoidal angle difference? Did you use a lookup table or calculate on the fly? I was concerned that too much floating point math would be too slow
[16:25:31] <kre10s_> say you restart your timer on upflank. and remember the downflank timer value. zero crossing will be in between. the maximum timer value will be 1/2 a phase. so you can easily trigger at an arbitrary offset, taking care not to trigger very close to zero because the trigger pulse also has a width.
[16:27:02] <kre10s_> For linearizion I built a lookup table to transform a uint8_t %power into a %phase and did uint16_t trigger =
[16:27:16] <kre10s_> fudge. let me look it up.
[16:28:15] <bss36504> That's what I was going to do. I have to leave but I'll see your message tomorrow if you reply.
[16:33:16] <kre10s_> lol. looks like I just used doubles... It's only 50Hz anyway. you should have plenty of time. to update the phase cut angle between half phases.
[16:35:15] <kre10s_> A bigger pain is the PID controller. Ovens are very slow and hard to control tightly.
[16:40:40] <kre10s_> One trick you can do is to set your oven to n% power and let it sit for a few hours then record the inside/outside temp. with that calculate the thermal resistance of your oven. Knowing the thermal resistance of the oven you can use it as a minimum power setting to speed up the PID attack time.
[17:20:47] <cehteh> mhm i made a cascaded controller for a oven which works pretty well
[17:20:58] <cehteh> also with linear feed forward
[20:30:49] <eszett> i have a question
[20:32:10] <eszett> A pin can be output or input, high or low, what
[20:32:25] <eszett> is this code line about? static matrix_row_t read_cols(void) { return (PINB&(1<<3) ? 0 : (1UL<<0)); }
[20:33:41] <cehteh> (1UL<<0) .. lol
[20:34:50] <eszett> ye
[20:35:12] <eszett> can you translate the code line in english?
[20:35:28] <cehteh> i'd use return !!(PINB&(1<<3)) ... or return PINB&(1<<3) !=0
[20:35:46] <cehteh> err it inverses
[20:36:04] <cehteh> if bit is set then return 0 else 1
[20:36:22] <cehteh> so return !(PINB&(1<<3)) ... or return PINB&(1<<3) ==0
[20:36:22] <eszett> if pin B3 is high, than return "0" right?
[20:36:26] <cehteh> yes
[20:37:01] <cehteh> the ?: ternary operator is sometimes nice, but i' tend to use it only where really needed
[20:37:28] <eszett> ahh.. and when i have the pin B3 on "input low" by default, then i have to change the line to return (PINB&(1<<3) ? 1 : (1UL<<1));
[20:38:02] <cehteh> eh?
[20:38:14] <cehteh> that would be equal to return 1
[20:38:27] <cehteh> err no ... too late :D
[20:38:48] <cehteh> wtf do you try to do?
[20:38:55] <eszett> ok i try to explain it
[20:39:47] <eszett> The code is for a keyboard firmware. And by default the cols are in input high, and rows are output low. Id like to change the code to the opposite, having cols input /low/, and rows output /high/
[20:41:24] <eszett> there isnt much to change, just 4 functions.
[20:42:24] <cehteh> mhm
[20:42:42] <eszett> one sec..
[20:45:15] <eszett> http://pastebin.com/QsFDns5Q here is the original code
[20:46:36] <eszett> Im not sure about how to change these 2 functions:
[20:46:36] <eszett> static void unselect_rows(void)
[20:46:44] <eszett> and
[20:46:45] <eszett> static matrix_row_t read_cols(void)
[20:48:03] <cehteh> fugly
[20:48:09] <eszett> the intention of "unselect_rows" seems to be making "output low" (the rows) to "input low".
[20:48:45] <eszett> no idea why. but i have to alter the function, that it makes "output high" to "input high" right?
[20:49:00] <cehteh> how is the hardware, are there pulldown resistors?
[20:49:12] <eszett> no dedicated resistors there
[20:49:24] <cehteh> then things become floating
[20:49:31] <eszett> ah...
[20:50:21] <cehteh> also you need to be careful when multiple keys are pressed on a matrix
[20:50:25] <eszett> Its all just with designed for internal pullups, i think this no problem?
[20:50:26] <cehteh> that may short outputs
[20:50:45] <cehteh> if you reverse the logic then it may become a problem
[20:50:52] <eszett> argh
[20:50:54] <rue_bed> i fyou give each key a series diode, you can see them seperatly even if multiple are pressed
[20:51:15] <eszett> yes diodes are in the pcb
[20:51:17] <cehteh> yes diode is the pro part
[20:51:34] <cehteh> at least you should run the outputs throuh a series resistor 1k or so
[20:51:34] <rue_bed> oh, you have a keyboard and your coding for it?
[20:52:03] <rue_bed> usually you use open collector and pullup resistors
[20:52:03] <eszett> cehteh: also macht man die cols input high und die rows output low, weils andersrum probleme gibt? versteh ich aber nicht ganz, die rows sind ja wenn sie low sind auch am floaten
[20:52:15] <eszett> rue_bed ye
[20:52:18] <rue_bed> ist nin spek deutch
[20:52:37] <rue_bed> spekinzy?
[20:52:43] <cehteh> nop outputs are never floating
[20:52:47] <eszett> rue_bed yes its a keyboard firmware
[20:52:52] <cehteh> only inputs matter
[20:52:56] <rue_bed> ok
[20:53:32] <cehteh> output is driven into either potential
[20:53:39] <rue_bed> are you modifying working code or writing from scratch?
[20:53:42] <eszett> cehteh: they told me, it doesnt matter if i solder the diodes in with swapped polarity or not, because the code can be changed according to that
[20:53:53] <eszett> rue_bed modifying working code
[20:54:22] <cehteh> eszett: if something is input and floating (when no key is pressed) then it will be faulty
[20:54:33] <rue_bed> its easier if you know the diodesare the right way around
[20:55:08] <cehteh> just simple thing, dont let inputs float, that'll never work
[20:55:36] <cehteh> internal pullups are the simple thing there, and there are no internal pulldowns
[20:55:36] <eszett> argh, now i get it. to change polarity of diodes, i have to alter the code in that way, that cols become rows and rows become cols. but "input high" and "output low" stays the same
[20:55:43] <cehteh> that makes the decision simple :D
[20:55:58] <eszett> " there are no internal pulldowns" < that was my question!!! thx
[20:56:33] <rue_bed> I wwonder whatthe code I wrote lookslike
[20:57:50] <rue_bed> do you know the angorythm for scanning?
[20:58:00] <eszett> ye
[20:58:34] <eszett> its static matrix_row_t read_cols(void) { return (PINB&(1<<3) ? 0 : (1UL<<0)); }
[20:59:25] <rue_bed> no, do you know what you need to do, if you were to write it from scratch
[20:59:27] <eszett> translates to "if pin B3 is high, than there is no activity on row0, so for row0 the value "0" is returned.
[20:59:55] <eszett> im a beginner, i cant even properly read the code!
[21:00:03] <rue_bed> so, lets make an example keyboard
[21:00:08] <rue_bed> 2 rows, 2 columns
[21:00:10] <rue_bed> ok?
[21:00:13] <eszett> ye
[21:00:26] <rue_bed> row names A B
[21:00:41] <rue_bed> column names A` B`
[21:00:52] <eszett> ye
[21:00:55] <eszett> =)
[21:01:20] <rue_bed> lets make pins for rows output, and columns input
[21:01:54] <eszett> rows output low, right?
[21:02:08] <rue_bed> ok,
[21:02:25] <rue_bed> we use pullup configuration for input pins on columns
[21:02:36] <rue_bed> if no keys are pressed,
[21:02:59] <eszett> if no keys are pressed the input pins are high
[21:02:59] <rue_bed> colums will read as A`=1 B`=1
[21:03:46] <eszett> ye
[21:03:55] <rue_bed> if key A*A` is pressed
[21:04:19] <rue_bed> your answer
[21:04:27] <eszett> well
[21:04:39] <eszett> then A`=0 B`=1
[21:05:24] <rue_bed> yes, but because you output both rows low, you dont know if key is A*A` or B*A`
[21:05:31] <eszett> hmm
[21:05:41] <rue_bed> so, you do columns one at a time
[21:05:42] <eszett> how to figure out?
[21:05:48] <rue_bed> er, rows sorry
[21:05:58] <rue_bed> put only one row low at a time
[21:06:27] <eszett> yes, and that pretty quickly
[21:07:30] <rue_bed> does that help you understand?
[21:07:36] <eszett> sure..
[21:08:01] <eszett> cehteh said i shall not check if an input pin is "0"only if its "1", else there are problems arising
[21:08:10] <rue_bed> key identity is combination of row being scanned, and column being detected
[21:08:42] <rue_bed> it can be done either way
[21:08:55] <rue_bed> hmm
[21:09:10] <eszett> I could alter the function maybe to static matrix_row_t read_cols(void) { return (PINB&(1<<3) ? 1 : (1UL<<0)); }
[21:09:12] <rue_bed> does keyboard have any resistors?
[21:09:25] <eszett> some are in the basic circuit of the AVR
[21:09:33] <eszett> dataline resistors..
[21:09:42] <eszett> but nothing else..
[21:09:47] <rue_bed> no, avr only has pullup resistors
[21:10:09] <eszett> yes, but i had to add some resistors for the usb connector to work with the AVR
[21:10:44] <rue_bed> ? no relation to keyboard
[21:10:55] <eszett> "if pin B3 is high, then return a "1" for row0, telling that there is a key pressed on that row"
[21:11:14] <eszett> no relation to the keyboard matrix
[21:12:46] <rue_bed> how many rows and columns is the keyboard?
[21:13:10] <rue_bed> 4*4?
[21:13:17] <eszett> 5 rows 17 cols
[21:13:23] <rue_bed> hmm
[21:13:48] <eszett> do you know that the "unselect_rows" function is good for?
[21:14:10] <rue_bed> I need bigger screen
[21:14:17] <rue_bed> http://pastebin.com/QsFDns5Q
[21:14:46] <rue_house> http://imgur.com/gallery/ALGkIyc is not correct link
[21:16:07] <rue_house> unselect rows is setup for start of scan
[21:16:18] <rue_house> I need bowl of icecream too
[21:16:21] <rue_house> 1 minute
[21:16:39] <eszett> yummy
[21:17:29] <eszett> the function names are arbitrary, right. So there is "init_cols".. and "unselect_rows" could be named as "init_rows" too?
[21:17:47] <eszett> would make more sense
[21:20:46] <rue_house> ok, rows are wired to...
[21:21:17] <rue_house> portd 5, 3, 2, 1, 0?
[21:21:21] <eszett> ye
[21:22:25] <eszett> my question is how can i change the code, with having rows output high, instead of output low
[21:22:52] <rue_house> columns are portB 0, 1, 2, 3, 4, 5, 6 PORTC 6, 7 PORTD 6, 7 PORTF 0, 1, 4, 5, 6, 7 ?
[21:23:05] <eszett> lemme see
[21:23:10] <rue_house> I just need to understand whole picture
[21:23:28] <eszett> yes
[21:23:39] <eszett> * row pin configuration
[21:23:39] <eszett> * row: 0 1 2 3 4
[21:23:39] <eszett> * pin: D1 D0 D5 D3 D2
[21:23:39] <eszett> *
[21:23:57] <eszett> or wait, i better paste it in pastebin
[21:25:35] <eszett> http://i68.tinypic.com/s2qpvk.png
[21:25:53] <eszett> http://oi68.tinypic.com/s2qpvk.jpg
[21:26:12] <eszett> its as you said..
[21:26:52] <rue_house> ok
[21:28:02] <rue_house> in matrix.h what is matrix_row_t
[21:28:34] <rue_house> unsigned long?
[21:28:38] <eszett> lemme see
[21:29:18] <eszett> #elif (MATRIX_COLS <= 32)
[21:29:18] <eszett> typedef uint32_t matrix_row_t;
[21:29:33] <rue_house> ok
[21:30:24] <eszett> 17 cols is larger than 16, so it must be uint32_t, not uint16_t
[21:30:41] <rue_house> yes
[21:31:41] <rue_house> ok
[21:31:45] <rue_house> so
[21:31:58] <eszett> the "t" stands for "temporary"? as it temporarily scans each of the cols for row 1, then each of the cols for row2, etc.
[21:32:40] <rue_house> loop is: for () { select_row(); read_cols(); unselect_rows(); }
[21:33:29] <eszett> ye
[21:33:59] <rue_house> select row makes the row an output, and forces it low
[21:34:31] <eszett> and this just for a short amount of time, right
[21:34:38] <rue_house> PORTD &= ~(1<<1); this should be made with macro for easy reading ClearBit(1, PORTD);
[21:34:54] <eszett> while the row is most of the time input low (as "unselect_rows" defines it)
[21:35:33] <rue_house> read_cols() checks to see if any column is low
[21:35:45] <eszett> ahh nice, ClearBit would be better readable i agree
[21:36:04] <rue_house> init_cols has set up that all the columns have pullup resistors turned on in avr
[21:37:00] <rue_house> this makes sense
[21:37:06] * eszett is listening to rue_house and adding comments to the code
[21:37:35] <eszett> ye
[21:37:45] <eszett> is this right: select_row(i); // makes a row from "input low" for a short time to "output low"
[21:38:30] <rue_house> the rows are made output one at a time and put low, the colums, which have pullups turned on, are checked after each row is made low. If a key is down, there will be a 0
[21:38:55] <eszett> matrix_row_t cols = read_cols(); // read_cols() checks to see if any column is low. If "yes", then a key is pressed on this col
[21:39:34] <rue_house> were you asked to change this to look for a 1 and not a 0?
[21:39:58] <eszett> no.. but i thought it might work
[21:40:53] <rue_house> no, because avr has pullup but no pulldown
[21:41:04] <eszett> how do i have to alter "read_cols" to scan with having rows redefined as output high and cols input low?
[21:41:08] <eszett> hm hm
[21:41:12] <eszett> but there must be a way?
[21:41:38] <rue_house> two ways,
[21:41:50] <rue_house> A) add pulldown resistors outside the avr
[21:42:19] <eszett> cant.. would be too much effort/expensive =)
[21:42:54] <rue_house> B) scan for 0, but do backwards, make columns input and rows output, will compensate for all diodes backwards
[21:43:11] <eszett> ahh yes!
[21:43:40] <rue_house> I leave to go build robots now?
[21:43:52] <eszett> alright, thanks for support ruw house
[21:45:46] <eszett> Can i use this method : return (PINB&(1<<3) ? 1 : (1UL<<0)) |
[21:46:07] <eszett> scanning for "1" as before, but returning a "1" instead of "0"?
[21:47:30] <rue_house> static matrix_row_t read_cols(void) {
[21:47:31] <rue_house> return (PIND&(1<<1) ? 0 : (1UL<<0)) |
[21:47:31] <rue_house> (PINB&(1<<0) ? 0 : (1UL<<1)) |
[21:47:31] <rue_house> (PINB&(1<<5) ? 0 : (1UL<<2)) |
[21:47:31] <rue_house> (PINB&(1<<3) ? 0 : (1UL<<3)) |
[21:47:31] <rue_house> (PINB&(1<<2) ? 0 : (1UL<<4)) ;
[21:47:33] <rue_house>
[21:47:35] <rue_house> }
[21:47:42] <eszett> ye
[21:47:46] <rue_house> instead of a keyboard thats 5*17, its 17*5
[21:48:08] <rue_house> select_row will be.... big....\
[21:48:08] <eszett> that's the most effortless method to do it
[21:48:23] <eszett> just treating rows as cols, and cols as rows
[21:48:40] <rue_house> case 0: ....... case 17:
[21:49:19] <rue_house> er :) 16
[21:49:23] <eszett> but isnt ther a third alternative, scanning for "1" as before, but returning a "1" instead of "0"?
[21:49:33] <rue_house> with outside resistors, yes
[21:50:55] <eszett> I see.. its just not meant to be using "output high"
[21:53:44] <rue_shop3> tooo many usb robots
[21:53:54] <rue_shop3> I need a 'flash identity led' command
[21:56:01] <eszett> rue house gotta take a nap, cu later
[21:58:51] <rue_shop3> gooden nackt...
[21:58:55] <rue_shop3> hmm
[21:59:04] <rue_shop3> ten...
[21:59:32] <rue_shop3> new rule, germans have to help me with my german
[21:59:37] <rue_shop3> deutch
[21:59:43] <rue_shop3> &%*@#%
[22:02:04] <eszett> Gute Nacht!
[22:02:21] <kre10s__> lol.
[22:05:33] <rue_shop3> *sigh*
[22:05:48] <rue_shop3> thought it was guten...
[22:06:23] <eszett> learning gender endings is a pain with german
[22:07:19] <eszett> Guten Tag (because /der/ Tag), but Gute Nacht (because /die/ Nacht)
[22:08:01] <eszett> but thats only valid for the accusative, in nominative its different =)
[22:11:23] <rue_shop3> yea, so its a language as bad as english,
[22:11:27] * rue_shop3 shrugs
[22:17:03] <rue_shop3> so it'd be gute nacht and gooten morgen